タイムアウトするメッセージボックス

時間が経つと自動で閉じるMessageBoxを作りたくなったので調べてみる。

結果、Google サジェストの提案から、どうやらMessageBoxTimeout関数を使うとできるらしいことがわかった。

でも、この関数は仕様が公開されてないらしい。念のためVisual C++ 2010 ExpressやMinGWが持ってるヘッダーファイルをgrepしてみたが見つからない。現在でも非公開のようだ。

とりあえずPythonで試してみるか。

確かに動くね。じゃあ、次はC言語(C99)から。

#ifdef UNICODE
#undef UNICODE
#endif

#include <windows.h>
#include <stdio.h>

typedef int (__stdcall * Type_MessageBoxTimeoutA)(HWND, LPCSTR, LPCSTR, UINT, WORD, DWORD);

int main(void) {
    HMODULE user32 = LoadLibrary("user32.dll");
    if (! user32) {
        fputs("user32.dll が読み込めません。\n", stderr);
        return 1;
    }

    Type_MessageBoxTimeoutA  MessageBoxTimeoutA;
    MessageBoxTimeoutA = (Type_MessageBoxTimeoutA) GetProcAddress(user32, "MessageBoxTimeoutA");

    if (! MessageBoxTimeoutA) {
        fputs("MessageBoxTimeoutA 関数の場所を取得できません。\n", stderr);
        FreeLibrary(user32);
        return 1;
    }

    MessageBoxTimeoutA(NULL, "このメッセージは3秒後に自動的で消滅する。",
                       "", MB_YESNO, LANG_NEUTRAL, 3 * 1000);

    FreeLibrary(user32);

    return 0;
}