メッセージボックス表示コマンド

[f:id:wraith13:20080108204644p:image


前々から作ろうと思ってたメッセージボックスを表示するだけのプログラムです。バッチファイルの御供にどうぞ。silentとも相性がいいです。

//////////////////////////////////////////////////////////////////////////////
//
//  includes
//

#if !defined(WINVER)
#define WINVER 0x0500
#endif

#if !defined(_WIN32_WINNT)
#define _WIN32_WINNT WINVER
#endif

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <windows.h>
#include <wincon.h>

#pragma comment(lib, "USER32.lib")
#pragma comment(lib, "SHELL32.lib")


///////////////////////////////////////////////////////////////////////////////
//
//  main
//

int main(int, char *[])
{
    std::wstring title = L"msgbox";
    std::wstring message;
    DWORD icon = MB_ICONINFORMATION;
    DWORD button = MB_OK;
    
    int argc;
    LPWSTR *args = CommandLineToArgvW(GetCommandLineW(), &argc);
    
    try
    {
        if (argc <= 1)
        {
            throw L"引数が指定されていません。";
        }
        
        int i = 1;
        while(i < argc)
        {
            if (L'-' == args[i][0])
            {
                switch(args[i][1])
                {
                
                case L'I':
                case L'i':
                    switch(args[i][2])
                    {
                    
                    case L'I':
                    case L'i':
                        icon = MB_ICONINFORMATION;
                        break;
                        
                    case L'E':
                    case L'e':
                        icon = MB_ICONEXCLAMATION;
                        break;
                        
                    case L'S':
                    case L's':
                        icon = MB_ICONSTOP;
                        break;
                        
                    case L'Q':
                    case L'q':
                        icon = MB_ICONQUESTION;
                        break;
                        
                    default:
                        throw L"不明なオプションが指定されました。";
                        
                    }
                    break;
                
                case L'B':
                case L'b':
                    switch(args[i][2])
                    {
                    
                    case L'A':
                    case L'a':
                        button = MB_ABORTRETRYIGNORE;
                        break;
                    
                    case L'C':
                    case L'c':
                        button = MB_OKCANCEL;
                        break;
                        
                    case L'Y':
                    case L'y':
                        button = MB_YESNO;
                        break;
                        
                    case L'N':
                    case L'n':
                        button = MB_YESNOCANCEL;
                        break;
                        
                    case L'O':
                    case L'o':
                        button = MB_OK;
                        break;
                        
                    case L'R':
                    case L'r':
                        button = MB_RETRYCANCEL;
                        break;
                        
#if 0x0500 <= WINVER
                    case L'T':
                    case L't':
                        button = MB_CANCELTRYCONTINUE;
                        break;
#endif
                        
                    default:
                        throw L"不明なオプションが指定されました。";
                        
                    }
                    break;
                    
                case L't':
                    title = args[i] +2;
                    break;
                
                default:
                    throw L"不明なオプションが指定されました。";
                    
                }
            }
            else
            {
                break;
            }
            ++i;
        }
        if (argc <= i)
        {
            throw L"メッセージが指定されていません。";
        }
        while(i < argc)
        {
            message += args[i];
            message += L"\n";
            ++i;
        }
    
    }
    catch(const wchar_t *a_message)
    {
        title = GetCommandLineW();
        message = a_message;
        message += L"\n";
        message += L"\n";
#if 0x0500 <= WINVER
        message += L"msgbox [-ii|-ie|-is-|-iq] [-ba|-bc|-by|-bn|-bo|-br|-bt] [-tタイトル] メッセージ1 [メッセージ2...]";
#else
        message += L"msgbox [-ii|-ie|-is-|-iq] [-ba|-bc|-by|-bn|-bo|-br] [-tタイトル] メッセージ1 [メッセージ2...]";
#endif
        icon = MB_ICONSTOP;
        button = MB_OK;
    }
    
    LocalFree(args);
    
#if 0x0500 <= WINVER
    return MessageBoxW(GetConsoleWindow(), message.c_str(), title.c_str(), icon |button);
#else
    return MessageBoxW(NULL, message.c_str(), title.c_str(), icon |button);
#endif
}

↓こんな感じで呼び出すと

msgbox -ii -bo -t"サンプル メッセージ" "msgbox の使用例" " " "こんな感じでメッセージボックスを表示できます。"

↓こんな風に表示されます。(真ん中の空行は↑のダブルクォーテーションで括った半角のスペースで指定しています。)

メッセージボックスのどのボタンが押下されたのかの判断は環境変数 %ERRORLEVEL% が以下の表(winuser.h で #define されてる定数で関係ないものも含んでいます)からどの値になったかで判断してください。

ID WINVER
IDOK 1 -
IDCANCEL 2 -
IDABORT 3 -
IDRETRY 4 -
IDIGNORE 5 -
IDYES 6 -
IDNO 7 -
IDCLOSE 8 0x0400以上
IDHELP 9 0x0400以上
IDTRYAGAIN 10 0x0500以上
IDCONTINUE 11 0x0500以上
IDTIMEOUT 32000 0x0501以上