我在Win32控制檯應用程序中使用MessageBox
函數。
應用程序不會使用MFC,甚至不是事件循環。
如果用戶沒有按任何按鈕,我需要製作一個包裝MessageBoxTimed(),它在N秒後退出
(並且對話框消失)。定時在控制檯應用程序中的MessageBox
有沒有或多或少簡單的方法來做到這一點?
我在Win32控制檯應用程序中使用MessageBox
函數。
應用程序不會使用MFC,甚至不是事件循環。
如果用戶沒有按任何按鈕,我需要製作一個包裝MessageBoxTimed(),它在N秒後退出
(並且對話框消失)。定時在控制檯應用程序中的MessageBox
有沒有或多或少簡單的方法來做到這一點?
有關一個實現的示例,請參見MSDN中的this article。我們在我們的一些項目中使用它,它工作正常。
這不是微不足道的。由於MessageBox()
函數本身是模態的,因此您可能需要啓動另一個等待預定義秒數的線程,並且如果消息框被手動解除,則該中斷可以中斷。
如果計時器到期,請使用FindWindow()
API查找消息框的句柄,然後模擬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);
}
如果你需要自動解僱它,我會盡量避免使用MessageBox
。相反,我只是將一段對話框放在指定的時間段後自行關閉。如果內存服務,您可以通過設置顯示僞消息框對話框的時間來輕鬆完成此操作。當時間到了或用戶點擊「確定」(或「關閉」等)時,關閉窗口並取消定時器。
不要這樣做。用戶干預應關閉模式對話框。偏離這種模式只是混淆和不規範。如果你想要一個關閉自己的消息窗口,然後使用氣球窗口。
但它更簡單(更短的代碼)? – Andrei
@Andrei:可能。對於SetTimer,KillTimer以及您爲了關閉對話而做的任何操作,通常都是一次調用。但我同意David Heffernan的說法,這聽起來不像是模態對話的理想應用。我會考慮類似消息日誌窗口。 –