4

Visual Studioを使用して、Windows上でC++プログラムを構築しています。これは、通知用のWindowsメッセージを送信するCOMベースAPIに依存しています。

これらのメッセージを処理するには、次の2つの可能性があります。

  • Windowsフォームを作成し、メッセージを処理するdoModalを呼び出しますが、UIを使用したくないので、それは私がやりたいことではありません。
  • メッセージを処理するための独自のループを作成する

何が最善か、またはメッセージを処理する別の方法があるかどうかはわかりません(おそらくループを起動できるWindows関数があります)

  while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
  { 
    if (bRet == -1)
    {
      // handle the error and possibly exit
    }
    else
    {
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
    }
  } 
4

2 に答える 2

4

はい、できます。すべてのスレッドは1つのメッセージループを持つことができ、メッセージを受信または送信するためのウィンドウは必要ありません(を参照PostThreadMessage)。

アプリケーションがイベント駆動型の場合、このメソッドを使用しても問題はありません。

于 2011-03-03T15:47:35.450 に答える
4

それはあなた自身の利益のためだけではありません、COMあなたにメッセージループを作成することを要求します。COMは、「マルチスレッドをサポートしないコンポーネント」を表す高価な言葉である、アパートのスレッド化されたCOMサーバーを処理するためにそれを必要とします。それらの大多数はそうではありません。

ウィンドウを作成するのが最善です。表示する必要はありません。これにより、SendMessage()呼び出しで使用できるHWNDが得られます。作成したウィンドウプロシージャはメッセージを処理できます。そこから、たとえばShell_NotifyIconを使用して、最小限のユーザーインターフェイスを簡単に作成できるようになります。何か問題が発生したときに通知を表示できる場合は、常に便利です。誰も見たことのないログのイベントよりもはるかに優れています。

于 2011-03-03T17:02:52.433 に答える