ウィンドウをサブクラス化せずに特定のウィンドウ メッセージをフックする方法はありますか。
WH_GETMESSAGE がありますが、パフォーマンスの問題が発生しているようです。
これら以外に、パフォーマンスを低下させないソリューションはありますか?
AFAIKあなたが言ったことよりも良い解決策はありません。そしてもちろん、ウィンドウのサブクラス化は、スレッドのすべてのメッセージをフックするよりも優れています。
メッセージがウィンドウによって処理されるまでに通過するパスを考えてみましょう。
PostMessage
メッセージは、 /への明示的な呼び出しSendMessage
またはOSによる暗黙的な呼び出しのいずれかによって、ウィンドウに投稿または送信されます。GetMessage
または同様の方法で)、次にを呼び出しますDispatchMessage
。CallWindowProc
(または同様の)ことによってウィンドウのプロシージャを呼び出します。CallWindowProc
、ウィンドウに関連付けられているウィンドウ手順を識別します(GetClassLong
/を介してGetWindowLong
)サブクラス化-ターゲットウィンドウのウィンドウプロシージャを置き換えることを意味します。これは最良の変種のようです。フラグ付きのフックをインストールWH_GETMESSAGE
すると、メッセージキューに投稿されたすべてのメッセージが監視されます。これは次の理由で悪いです:
DispatchMessage
)。そのため、サブクラス化ははるかに優れているようです。
もう1つの解決策-特定のメッセージが(送信されるのではなく)投稿された場合、メッセージループをオーバーライドし、取得されたメッセージごとに前処理/後処理を行うことができます