2011-07-20 12 views
0

私は関数をWin32コンソールアプリケーションで使用します。
アプリケーションは、イベントループでなく、MFCを使用しません。
ユーザーがボタンを押さなかった場合、N秒後に
(そしてダイアログボックスが消える)というラッパーMessageBoxTimed()を作成する必要があります。コンソールアプリケーションのtimed 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をまったく使用しないでください。代わりに、私はちょうど一緒に指定された時間の後に閉じてダイアログをまとめるだろう。メモリが提供されている場合は、擬似メッセージボックスダイアログを表示する時間を設定することで、これを簡単に行うことができます。時間がなくなるか、ユーザーが「OK」(または「閉じる」など)をクリックすると、ウィンドウを閉じてタイマーをキャンセルします。

+0

しかし、それは簡単です(短いコード)ですか? – Andrei

+0

@Andrei:おそらく。これは通常、SetTimer、KillTimer、およびダイアログを閉じるために何をしても1回ずつ呼び出されます。私はDavid Heffernanには同意しますが、これはモーダルダイアログの理想的なアプリケーションのようには聞こえません。私は代わりにメッセージログウィンドウのようなものを考えています。 –

0

これを行わないでください。モーダルダイアログはユーザーの介入によって閉じられるべきです。このパターンから外れるのは、ちょうど混乱し、非標準です。自分自身を閉じるメッセージウィンドウが必要な場合は、バルーンウィンドウを使用します。