Это не будет тривиальным. Поскольку сама функция MessageBox()
является модальной, вам, вероятно, потребуется запустить другой поток, который ожидает определенное количество секунд и может прерываться, если окно сообщения закрывается вручную.
Если время таймера истекло, используйте API FindWindow()
, чтобы найти дескриптор окна сообщения, а затем смоделируйте нажатие кнопки OK или, что более подходящее, нажатие кнопки ESC.
РЕДАКТИРОВАТЬ: На самом деле, не так уж плохо. Это не полностью проверено, может потребоваться дополнительная очистка, но этого достаточно для начала работы.
#include <Windows.h>
class TimedMB
{
public:
TimedMB() : timeout_(0), caption_(0)
{
interrupt_ = CreateEvent(NULL, FALSE, FALSE, NULL);
}
~TimedMB()
{
CloseHandle(interrupt_);
}
static DWORD WINAPI timer(LPVOID param)
{
TimedMB* mb = reinterpret_cast<TimedMB*>(param);
if(WAIT_TIMEOUT == WaitForSingleObject(mb->interrupt_, mb->timeout_))
{
HWND message_box = FindWindow(NULL, mb->caption_);
if(::IsWindow(message_box))
{
PostMessage(message_box, WM_COMMAND, IDCANCEL, 0);
}
}
return 0;
}
void DisplayMessageBox(const char* msg, const char* caption, DWORD timeout)
{
timeout_ = timeout;
caption_ = caption;
CreateThread(NULL, 0, &TimedMB::timer, this, 0, NULL);
::MessageBox(NULL, msg, caption, MB_OKCANCEL);
::SetEvent(interrupt_);
}
private:
HANDLE interrupt_;
DWORD timeout_;
const char* caption_;
};
int main()
{
TimedMB mb;
mb.DisplayMessageBox("Hello There!", "My Message Box", 5000);
}