控制台应用程序中的定时MessageBox

时间:2011-07-20 20:41:15

标签: winapi

我在Win32控制台应用程序中使用MessageBox函数 应用程序不使用MFC,甚至不使用事件循环 我需要创建一个包装,MessageBoxTimed(),退出
(如果用户没有按任何按钮,则在N秒后(和对话框消失)。

有或多或少的简单方法吗?

4 个答案:

答案 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)

不要这样做。应通过用户干预关闭模态对话框。偏离这种模式只是令人困惑和不标准。如果您想要一个自行关闭的消息窗口,请使用气球窗口。