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する方法は、親ウィンドウを指定した場合に固まるようなので。