hModとdwTIDを 0に設定すると、_LL (LowLevel) を使用してフックをグローバルに動作させようとしています。
.dll なしで動作させる方法はありますか?
hModとdwTIDを 0に設定すると、_LL (LowLevel) を使用してフックをグローバルに動作させようとしています。
.dll なしで動作させる方法はありますか?
これは不可能です。この要件は、MSDN でグローバル フックについて話したり、その例を示したりするほぼすべての場所で言及されています。いくつかの例:
... グローバル フック プロシージャは、呼び出しスレッドと同じデスクトップ内の任意のアプリケーションのコンテキストで呼び出すことができるため、プロシージャは別の DLL モジュール内にある必要があります。...
... フック プロシージャをインストールするアプリケーションとは別の DLL に、グローバル フック プロシージャを配置する必要があります。...
... すべてのグローバル フック関数はライブラリ内にある必要があります。...
その理由は、ドキュメントに従って他のアプリケーションのコンテキストでコードを実行できる可能性があることに注意してください。からSetWindowsHookEx
:
... WH_MOUSE、WH_KEYBOARD、WH_JOURNAL*、WH_SHELL、および低レベルのフックは、フックを処理するスレッドではなく、フックをインストールしたスレッドで呼び出すことができることに注意してください。...
その文で缶が実際に何を意味するのか、私にはよくわかりません。そのような場合もあるし、逆の場合もありますが、テストを 1 回だけ実行したところ、フックをインストールしたスレッドのコンテキストでフック プロシージャが実際に呼び出され、プロセス間通信が不要になりました。ただし、これはdllの要件を変更しません。
低レベルのフックの処理は単純に異なります。ドキュメントである程度説明されているように、フックの呼び出しは、フックをインストールしたスレッドにメッセージを送信し、コンテキストをそのスレッドに切り替えることによって行われます。これには、dll のインストールは必要ありません。
明確にするために、WH_KEYBOARD_LL と WH_MOUSE_LL は、dll を必要としない低レベルのグローバル フックです (WH_KEYBOARD のような他のフックは、他のプロセスに挿入するために dll を必要とします)。
1 つまたは複数の外部プロセスにフックする場合は、フック コードをこれらのプロセスのアドレス空間に挿入する必要があり、DLL だけがそれを実行できるため、DLL 内にフックを実装する必要があります。
独自の呼び出しプロセスだけをフックする場合は、DLL は必要ありませんが、SetWindowsHookEx()
スレッドごとに呼び出してスレッド固有のフックをインストールする必要があります。つまり、hMod
値をに設定しNULL
、dwThreadId
パラメータを非fromGetCurrentThreadId()
やなどのゼロ値CreateThread()
。