3

致命的な接続エラーが発生したときに MessageBox 呼び出しを介してモーダル ウィンドウをポップアップする従来の C Windows アプリケーションがあります。当社のネットワーク エンジニアは、これらのアプリケーションの多くを同時に実行している場合があります。場合によっては、ネットワークの不具合により、これらのアプリケーションによって処理されている接続が同時に失敗することがあります。

Windows 7 では、モーダル ダイアログが WM_QUIT メッセージを処理していないように見えるため、タスクバーから [すべてのウィンドウを閉じる] 機能を選択しても機能します。私は通常、Linux システムで作業していますが、MSDN の調査によると、このメッセージをキャッチして処理するには、独自のダイアログを作成し、メッセージを自分で処理するしかありません。

私の心配は、私がより簡単な解決策を見落としていることです.誰かが代替案を提供できますか?

4

2 に答える 2

3

モーダル ダイアログのメッセージ ループは、 をキャッチWM_QUITし、応答として呼び出し、を使用してアプリケーションのメイン ウィンドウEndDialog()にメッセージを渡す必要があります。WM_QUITPostMessage()


アップデート:

a がモーダルダイアログに送信される場合、上記で提案されたアプローチは機能しWM_QUITます...-しかし、少なくとも現在のwin7マシンではそうではありません。

WM_SYSCOMMANDさらに、メイン ウィンドウがwith wParamset to を受け取り、SC_CLOSEどういうわけかデフォルトのメッセージ ハンドラーがそれを無視する場合があります (これは、モーダル ダイアログ ボックスのスタイルが原因である可能性があります...? これについては詳しく調査していません)。

ただし、メインウィンドウのメッセージ ループに次のブランチを追加するswitchと、OP で記述された条件下でアプリケーションを終了する必要があります。

  ...

  case WM_SYSCOMMAND:
    if (SC_CLOSE == wParam)
    {
      PostQuitMessage(<whatever code shall be returned>);
    }

    return DefWindowProc(...);
   
  ...
于 2013-07-02T18:43:33.593 に答える
1

これはトリッキーかもしれません。

通常、Windows アプリケーションを終了するには、「Windows メッセージ ループ」を終了する必要があります。これを行う最も簡単な方法は、PostQuitMessage(retCode) などの終了メッセージをポストすることです。ここで、retCode は、メイン メッセージ ループ ハンドラが処理できる値です。通常、ゼロ、つまり無視します。

通常、PostQuitMessage は WM_DESTROY メッセージへの応答としてポストされます。

それは本当にレガシー コードに依存します。同情します。私もレガシー コードを扱っています。私のコードには別のメッセージ ループがあり、モーダル ダイアログ ボックスが継続的に表示されます。EndDialog を呼び出して PostQuitMessage(0) を呼び出すと、アプリケーションが正しく終了しました。

于 2013-07-02T17:58:07.877 に答える