12

Win32プログラムには通常、 GetMessageまたはPeekMessageの呼び出しをループするメッセージループがあり、 DispatchMessageを呼び出して、関連するウィンドウのウィンドウプロシージャにメッセージをディスパッチします。

しかし、実際にこれを行う必要はありますか?代わりに、メッセージループでMSGオブジェクトを直接調べて、DispatchMessageを呼び出さずにそこで必要なアクションを実行できますか?たとえば、ウィンドウがdirect3d表示ウィンドウとしてのみ使用されている場合、メッセージは常に唯一のウィンドウに送信されるため、他のウィンドウコントロールがない単一のウィンドウがある場合について話します。

ほとんどの場合、私は興味がありますが、コードの特定の側面もよりクリーンになる可能性があります。

4

1 に答える 1

13

DispatchMessageメッセージを適切なウィンドウ、つまり「ウィンドウプロシージャ」に配信するように呼び出します。ウィンドウは1つだけだと思いますが、本当に1つだけですか?COMヘルパーウィンドウを作成しますが、他のサブシステムもヘルパー非表示ウィンドウを作成する場合があります。ヘルパー非表示ウィンドウは、共有メッセージキューに投稿され、それらのウィンドウにアドレス指定されたメッセージを配信します。これらの詳細について多くを考える必要なしに、それらをディスパッチするためのAPIがあります。そして、それらのサブシステムはメッセージポンプの存在に依存しているので、それをしなければなりません。

Spy++Windows SDKツールは、実際に使用しているウィンドウの数を確認するのに役立つ場合があります。

それでも、実際に唯一のウィンドウがある場合は、ハンドラーがDispatchMessage内部から呼び出されるか、メッセージポンプから直接呼び出されるかにかかわらず、大きな違いはありません。

于 2012-09-05T13:37:35.533 に答える