3

フックは別のプロセスのコンテキストで呼び出されるため、グローバル Windows フックは DLL 内にある必要があります。そのため、フック プロシージャのコードをそのプロセスに挿入する必要があります。ただし、制限があります。

SetWindowsHookExDLL を別のプロセスに挿入するために使用できます。32 ビット DLL を 64 ビット プロセスに挿入することはできず、64 ビット DLL を 32 ビット プロセスに挿入することもできません。アプリケーションが他のプロセスでフックを使用する必要がある場合、32 ビット アプリケーションを呼び出し SetWindowsHookExて 32 ビット DLL を 32 ビット プロセスに挿入し、64 ビット アプリケーションを呼び出し SetWindowsHookExて 64 ビット DLL をプロセスに挿入する必要があります。 64 ビット プロセス。32 ビット DLL と 64 ビット DLL は異なる名前にする必要があります。

このため、 and の代わりに低レベルのフック and を使用したいと思いWH_MOUSE_LLます。ドキュメントからわかるようWH_KEYBOARD_LLWH_MOUSEWH_KEYBOARD

このフックは、それをインストールしたスレッドのコンテキストで呼び出されます。呼び出しは、フックをインストールしたスレッドにメッセージを送信することによって行われます。したがって、フックをインストールしたスレッドにはメッセージ ループが必要です。

このことから、これらの特定のフック プロシージャは別の DLL に存在する必要はなく、それらをフックした EXE 内に存在するだけでよいと考えるようになりました。ただし、のドキュメントには次のように記載されています。SetWindowsHookEx

lpfn

[in] フック プロシージャへのポインター。dwThreadIdパラメーターがゼロであるか、別のプロセスによって作成されたスレッドの識別子を指定する場合、パラメーターはlpfnDLL 内のフック プロシージャを指している必要があります。

2 つの低レベルのフックに対する明示的な例外は言及されていません。

別の DLL にフック プロシージャを持たずに、低レベルのフックを使用する .NET アプリケーションをいくつか見てきました。これは、これが受け入れられることを示すもう 1 つのヒントです。ただし、ドキュメントで禁止されているため、自分でこれを行うのは少し怖いです。

DLL を使用せず、これらの低レベルのフック プロシージャを直接 EXE に挿入した場合に問題が発生すると予測する人はいますか?

編集:報奨金については、決定的な「はい、これは大丈夫です...」または「いいえ、これはうまくいかない可能性があるため...」.

4

5 に答える 5

4

これ実際にはドキュメントにあります。SetWindowsHookExおよび友人のドキュメントにはありませんが、.NETナレッジベースの記事にあります。

低レベルのフックプロシージャは、フックをインストールしたスレッドで呼び出されます。低レベルのフックでは、フックプロシージャをDLLに実装する必要はありません。

于 2010-03-10T18:42:37.673 に答える
3

dll ルールのグローバル フック機能には 1 つの例外があります。低レベルのマウスおよびキーボード フックは、フックされているプロセスではなく、呼び出しプロセスのコンテキストで実行されます (内部的に、Windows は Windows メッセージを介してフックに通知します)。したがって、フック コードは任意のプロセスで実行されず、.Net で記述できます。例については、 http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspxを参照してください。

ただし、その他のフックについては、SetWindowsHookEx の 32 ビット バージョンを呼び出して 32 ビット プロセスでフック関数を渡し、SetWindowsHookEx の 64 ビット バージョンを呼び出して 64 ビット プロセスでフック関数を渡す必要があります。

于 2009-11-02T18:52:25.427 に答える
1

グローバル フックは、低レベルであろうと高レベルであろうと、各プロセスにロードできる個別の DLL に存在する必要があります。あなたが引用したドキュメントはそれをかなり明確にしています。低レベルのフックに適用される例外があった場合、そのドキュメントにもそのように記載されています。

于 2009-10-28T19:31:53.023 に答える
0

編集:以前の回答を取り消します。WH_MOUSE_LL と WH_KEYBOARD_LL は、グローバル フックに関する通常のルールの例外であることが判明しました。

SetWindowsHookEx に渡される HINSTANCE は何に使用されますか?

于 2009-11-03T16:10:58.193 に答える
0

経験則: ドキュメントが何かをしてはいけないと言っている場合、通常、それにはかなりの理由があります。場合によっては機能する可能性がありますが、機能するという事実は実装の詳細であり、変更される可能性があります。その場合、実装が変更されるとコードが壊れます。

于 2009-11-02T18:56:07.010 に答える