2011-07-20 44 views
0

我在Win32控制檯應用程序中使用MessageBox函數。
應用程序不會使用MFC,甚至不是事件循環。
如果用戶沒有按任何按鈕,我需要製作一個包裝MessageBoxTimed(),它在N秒後退出
(並且對話框消失)。定時在控制檯應用程序中的MessageBox

有沒有或多或少簡單的方法來做到這一點?

回答

2

有關一個實現的示例,請參見MSDN中的this article。我們在我們的一些項目中使用它,它工作正常。

2

這不是微不足道的。由於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); 
    } 
0

如果你需要自動解僱它,我會盡量避免使用MessageBox。相反,我只是將一段對話框放在指定的時間段後自行關閉。如果內存服務,您可以通過設置顯示僞消息框對話框的時間來輕鬆完成此操作。當時間到了或用戶點擊「確定」(或「關閉」等)時,關閉窗口並取消定時器。

+0

但它更簡單(更短的代碼)? – Andrei

+0

@Andrei:可能。對於SetTimer,KillTimer以及您爲了關閉對話而做的任何操作,通常都是一次調用。但我同意David Heffernan的說法,這聽起來不像是模態對話的理想應用。我會考慮類似消息日誌窗口。 –

0

不要這樣做。用戶干預應關閉模式對話框。偏離這種模式只是混淆和不規範。如果你想要一個關閉自己的消息窗口,然後使用氣球窗口。