2013-08-09 5 views
9

私のアプリケーションでESCキーを処理しています。このキーが受信されたら、現在のウィンドウを閉じます。ウィンドウを閉じるWin32 C++プログラミングで、自分自身またはSendMessage(WM_CLOSE、hWnd、0、0)をDestroyWindow(hWnd)を呼び出す必要がありますか?

DestroyWindow(hWnd)とするか、またはSendMessage(WM_CLOSE, hWnd, 0, 0)とするか、現在のウィンドウを別の方法で閉じる必要がありますか?

+0

あなたの 'WM_CLOSE'ハンドラがすべて' DestroyWindow() 'をコールすれば、それを直接呼び出さない理由はありません。他の処理を行いたいかどうかによって決まります(たとえば、「あなたは本当に終了しますか?」ダイアログを表示します)。 –

+0

ありがとうジョナサン。私は他の処理をしません、私の 'WM_CLOSE'ハンドラーは単に' DestroyWindow() 'を呼び出します。 – bodacydo

答えて

16

あなたはすべきであるPostMessage(hWnd, WM_CLOSE, 0, 0)。処理のためにWM_CLOSEメッセージをウィンドウのメッセージキューに入れ、メッセージキューがクリアされるとウィンドウを適切に閉じることができます。

SendMessageの代わりにPostMessageを使用する必要があります。違いは、PostMessageは単にメッセージをメッセージキューに入れて返すことです。 SendMessageはウィンドウからの応答を待つので、WM_CLOSEの場合はその必要はありません。

0

どちらかのPostMessageかのSendMessage WM_CLOSE

+0

ありがとうポール、私はそれを試みています。 PS。 PostMessageとSendMessageの違いは何ですか? – bodacydo

+0

メモリからWin32を実行して以来、SendMessageはメッセージを同期的に送信していますが、PostMessageは通常のメッセージ処理のためにメッセージをキューに入れて非同期に動作します。 –

+0

-1 'PostMessage'は' SendMessage'ほど良いと示唆していますが、 'SendMessage'は確かに間違ったツールです。 – IInspectable

2

使用するのはあなた次第です。 Escキーは、閉じるボタンをクリックするのと同じように動作するのでしょうか、それとも確実にウィンドウを破棄すべきですか?

WM_CLOSEのデフォルトの実装では、(DefWindowProcに見られるような)DestroyWindowを呼び出しますので、あなたは、特に、その後WM_CLOSEを処理していない場合は、1つは、別のと同じくらい良いです。しかし、WM_CLOSEは、必ずしもDestroyWindowを呼び出す必要はありません。したがって、問題のウィンドウがそれを処理する場合は、別の処理を行うことができます。たとえば、it could pop up a "Are you sure?"-type message boxとするか、単に何もしないでください。 DestroyWindowはそのすべてをバイパスします。

1

PostQuitMessageを使用する必要があります。 MSDNから

はのPostMessage関数を使用PostQuitMessageを使用して WM_QUIT メッセージを投稿しないでください。

PostMessageを使用すると、hWnd値が何らかの形でHWND_BROADCASTになった場合、そのメッセージをすべてのトップレベルウィンドウに送信する危険性があります。

関連する問題