我在Win32控制台应用程序中使用MessageBox
函数
应用程序不使用MFC,甚至不使用事件循环
我需要创建一个包装,MessageBoxTimed(),退出
(如果用户没有按任何按钮,则在N秒后(和对话框消失)。
有或多或少的简单方法吗?
答案 0 :(得分:2)
这不会是微不足道的。由于MessageBox()
函数本身是模态的,因此您可能需要启动另一个等待预定义秒数的线程,并且如果手动关闭消息框,则可以中断。
如果计时器到期,请使用FindWindow()
API查找消息框的句柄,然后模拟单击“确定”按钮,或者更恰当地按下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);
}
答案 1 :(得分:2)
有关一个实现的示例,请参阅MSDN中的this article。我们在一些项目中使用它,它工作正常。
答案 2 :(得分:0)
如果您需要自动关闭它,我会完全避免使用MessageBox
。相反,我只是把一个在指定的时间段后关闭的对话框组合在一起。如果内存服务,您可以通过设置显示伪消息框对话框的时间来轻松完成此操作。当时间结束或用户点击“确定”(或“关闭”等)时,您关闭窗口并取消计时器。
答案 3 :(得分:0)
不要这样做。应通过用户干预关闭模态对话框。偏离这种模式只是令人困惑和不标准。如果您想要一个自行关闭的消息窗口,请使用气球窗口。