web-dev-qa-db-ja.com

WindowsプログラムのWM_QUIT、WM_CLOSE、およびWM_DESTROYの違いは何ですか?

私は本質的に、WindowsプログラムのWM_QUIT、WM_CLOSE、およびWM_DESTROYメッセージの違いを疑問に思っていました:本質的には、それらはいつ送信され、プログラムによって定義されたもの以外に自動効果がありますか?

62
user98188

それらはまったく違います。

WM_CLOSEは、ウィンドウメニューから[X]を押すか、[閉じる]を選択すると、ウィンドウに送信されます。このメッセージをキャッチした場合、これをどのように処理するかを呼び出します。無視するか、実際にウィンドウを閉じます。デフォルトでは、WM_CLOSEDefWindowProcに渡されると、ウィンドウが破棄されます。ウィンドウが破棄されると、WM_DESTROYメッセージが送信されます。この段階では、toWM_CLOSEに反対して、プロセスを停止することはできず、必要なクリーンアップのみを行うことができます。ただし、すべての子ウィンドウが既に破棄される直前にWM_DESTROYをキャッチすることを忘れないでください。 WM_NCDESTROYは、すべての子ウィンドウが破棄された直後に送信されます。

WM_QUITメッセージはどのウィンドウにも関連していません(hwndから取得したGetMessageはNULLであり、ウィンドウプロシージャは呼び出されません)。このメッセージは、メッセージループを停止し、アプリケーションを閉じる必要があることを示しています。 GetMessageWM_QUITを読み取るとき、それを示すために0を返します。 標準的なメッセージループスニペット を見てください-GetMessageがゼロ以外を返す間、ループが継続されます。 WM_QUITは、PostQuitMessage関数によって送信できます。この関数は通常、メインウィンドウがWM_DESTROYを受け取ったときに呼び出されます( typical window procedure snippet を参照)。

80
adf88

まず、 WM_CLOSE および WM_DESTROY メッセージは特定のウィンドウに関連付けられていますが、 WM_QUIT メッセージはアプリケーション全体(スレッド)に適用されます。メッセージはウィンドウプロシージャ(WndProcルーチン)を介して受信されることはなく、GetMessageまたはPeekMessage関数を介してのみ受信されます。

WndProcルーチンでは、DefWindowProc関数がこれらのメッセージのデフォルトの動作を処理します。 WM_CLOSE メッセージは、アプリケーションを閉じることを要求します。これに対するデフォルトの動作は、DestroyWindow関数を呼び出すことです。このDestroyWindow関数が呼び出されると、 WM_DESTROY メッセージが送信されます。 WM_CLOSE は、閉じることを要求するメッセージにすぎないことに注意してください( WM_QUIT など)-実際に終了/終了する必要はありません。ただし、 WM_DESTROY メッセージは、ウィンドウ[〜#〜] [〜#〜](〜#〜]が閉じられて破棄されていることを示していますリソース、ハンドルなどをクリーンアップする必要があります。

10
user353297

ちょうどそれがコメントで迷子にならないように... _WM_CANCEL_を忘れないでください。 MFCダイアログの閉じる(x)ボタンをクリックすると、確実に_WM_CLOSE_が送信されます。デフォルトのOnClose()関数は、デフォルト(ベースクラス)OnCancel()関数を呼び出します。

ただし、単にESCキーを入力すると、ダイアログが閉じられますが、(私が知る限り)_WM_CLOSE_イベントを生成せずに-WM_CANCEL/OnCancel()メカニズム。

コミュニティにこれについて詳しく説明するか、その詳細を受け入れられた答えに編集するよう、ここに招待します。

4
omatai

まず、WM_QUIT-これはウィンドウに関連付けられていない別のメッセージとの違いについて説明しましょう。アプリケーションで使用されます。たとえば、これは非表示のスタンドアロンOLE server(.exeですが、.dllとしてのインプロセスではありません)で処理できます)

WM_CLOSE-msdnごと: "ウィンドウを破棄する前に、アプリケーションはユーザーに確認を求めることができます"-閉じようとする意図に関する通知として使用されます(この意図を拒否できます)。

WM_DESTROY-ウィンドウが閉じており、すべてのリソースの割り当てを解除する必要がある(!)という事実です。

2
Dewfy