メッセージボックス表示コマンド
前々から作ろうと思ってたメッセージボックスを表示するだけのプログラムです。バッチファイルの御供にどうぞ。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以上 |