0

私は現在、あるアプリケーション用のプラグインを作成していますが、それは WM_MBUTTONDOWN メッセージを処理しないため、WNDPROC をフックすることにしましたが、別のプラグインもそれをフックしてこのメ​​ッセージを処理しているようです (アプリケーションはプラグインをアルファベット順にロードするため、 WNDPROC を最後にフックしない可能性があり、その結果、他のプラグインが最初にメッセージを処理することになります)。これは、WNDPROC をフックしてそれらのメッセージを取得できるようにする最後の 1 人になる必要があることを意味します。

では、プロシージャを最後にフックする信頼できる (アルファベット順などに依存しない) 方法はありますか?

編集: フックは、ウィンドウの DWL_WNDPROC プロパティを、SetWindowLong 関数を使用してアドレス フック プロシージャに変更することによって行われます。元の DWL_WNDPROC は、CallWindowProc を使用してフック プロシージャから呼び出されます。これを明確にせずに申し訳ありません!

ありがとう、トゥントゥニ。

4

1 に答える 1

1

さて、インストールされたウィンドウ プロシージャ コールバックでは、GetWindowLongPtr呼び出しによって現在のウィンドウ プロシージャを確認しSetWindowLongPtr、誰かが変更した場合にプロシージャを再インストールできます。もちろん、これは危険であり、少なくとも、無限再帰を回避するために、(通常は静的カウンターを使用して) ウィンドウ プロシージャを再入から保護する必要があります。

また、ウィンドウのサブクラス化SetWindowsHookExの代わりに API 関数によってインストールされたシステム全体のフックを使用することもできます。これは、ウィンドウ プロシージャが呼び出される前 ( LL フックのマウス メッセージ投稿時または場合によっては) に呼び出される必要があるため、フックが呼び出される前に発生する必要があります。WH_MOUSEWH_MOUSE_LLWH_CALLWNDPROCGetMessageWH_CALLWNDPROC

于 2012-09-09T21:09:27.300 に答える