0

64 ビット システムで 64 ビット プロセスと 32 ビット プロセスの両方をフックするための秘密はありますか?

現在作成中のアプリケーションでは、64 ビット プロセスをフックできる必要があります。32 ビット プロセスのフックは 64 および 32 ビット システムで正常に機能しますが、64 ビット アプリケーションをフックしようとしてもメッセージが受信されません。

このようなことをするべきではないと誰かに言われる前に、これが私にとって非常に必要なことであることを説明させてください.グローバルシステムフックを設定しないと、私のアプリケーションは役に立たない/無意味になります.

このアプリケーションは C#/WPF で作成されていますが、実際のフックには C++ dll を使用しています。64 ビット システム用の dll をコンパイルしようとしましたが、まだ本来の動作をしていません。32 ビット システム用にコンパイルして実行すると、正確に動作します。

*編集:: ウィンドウ メッセージのフックについて話している - WH_CBT & WH_SHELL メッセージ

4

1 に答える 1

3

32 ビットと 64 ビットの両方のプロセスをフックするには、次のことを確認する必要があります。

  1. 32 ビット プロセスをフックする 32 ビット DLL と、64 ビット プロセスをフックする 64 ビット DLL があります。
  2. SetWindowsHookEx()は、32 ビット コードから呼び出されて 32 ビット プロセスをフックし、64 ビット コードから呼び出されて 64 ビット プロセスをフックします。

後者は基本的に、SetWindowsHookEx() を呼び出す 32 ビットと 64 ビットの両方の実行可能ファイルを作成し、それぞれ 32 ビットと 64 ビットの DLL を hMod パラメーターとして提供する必要があることを意味します。

アプリケーションが 32 ビットの場合、SetWindowsHookEx() を呼び出す 64 ビット プロセスを生成する必要があり、フックを解除するまでおそらく他に何もしません。Windowsは、このプロセスが終了/終了するとき/場合にフックを自動的に設定解除することに注意してください。したがって、フックが必要な間、おそらくアプリケーションの存続期間中ずっと生き続ける必要があります-この場合、64ビットプロセスを作成できますメイン アプリケーション プロセスが終了/終了するまで WaitForSingleObject() を実行し、WaitForSingleObject() の完了後にフックを解除して終了します。

于 2009-07-08T13:07:11.203 に答える