時限MessageBox

| コメント(0) | トラックバック(0)
Windows XP以降に実装されているUndocumentedなMessageBoxTimeoutというAPIが密かに知られていたらしいのですが、私は最近知りました。
で、これがuser32.libにも含まれていました。

というわけで、

#ifdef IDTIMEOUT
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
int WINAPI MessageBoxTimeoutA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType,WORD wLanguageId,DWORD dwMilliseconds);
int WINAPI MessageBoxTimeoutW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType,WORD wLanguageId,DWORD dwMilliseconds);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#ifdef UNICODE
#define MessageBoxTimeout  MessageBoxTimeoutW
#else
#define MessageBoxTimeout  MessageBoxTimeoutA
#endif // !UNICODE
#endif // IDTIMEOUT

IDTIMEOUTはXP以降でだけ定義されるので、そのまま流用。
これは名前の通りタイムアウト時の戻り値ですが、MB_OKの場合は常時IDOKが返るので注意。

wLanguageIdはMessageBoxExの説明を参照。通常は0。

MessageBox系APIは全て内部でこれを呼んでいる(dwMillisecondsに0xFFFFFFFF)と書いているサイトもありました。果たして49.7日で閉じるか否か。恐らくWaitForSingleObject同様に無期限扱いになるのでしょう。

今さらXPより前もないですが、ないOSではフックを仕掛けてWM_INITDIALOGの中でSetTimerして、ということになるのでしょう。別スレッドからPostQuitMessageする方法は、親ウィンドウを指定した場合に固まるようなので。

トラックバック(0)

トラックバックURL: https://mychro.mydns.jp/cgi-bin/mt/mt-tb.cgi/316

コメントする

アーカイブ

ウェブページ

Powered by Movable Type 5.2.13

ホームページ