現在、Windows764ビットO/Sでグローバルキーフックを機能させるのに問題があります。Stackoverflowには、このトピックに関するスレッドがすでにたくさんあることがわかりましたが、どれも私が作業できる答えを与えてくれないか、これらのスレッドで問題がどのように解決されるかをよく理解していません。
ですから、私が苦労していることを説明し、誰かが私を助けてくれるか、正しい方向に向けてくれることを願っています。
基本的に私の目標は、一種のクリップボードマネージャーのCTRL+CおよびCTRL+Vキーボード入力をインターセプトすることです。このため、私の現在の試みはWH_KEYBOARD
、傍受されたキーストロークを処理するシステム全体のフックを自分のニーズに合わせて登録することです。
私は64ビットのWindows7O / Sでフックを実行していますが、そこから問題が始まります。32ビットフックDLLが64ビットプロセスに問題を引き起こすことは私には明らかです。逆もまた同様です。このためSetWindowsHookEx()
、ドキュメントが示すように、フックを含むライブラリのx86バージョンとx64バージョン、およびフックの呼び出し元(呼び出し元)の両方を異なるファイル名で生成しました。
しかし、今は何ですか?64ビットDLLをシステム全体のフックとして設定すると、フォーカスされたときにキーを押すとすぐに、すべての32ビットアプリケーションがハングし始めます。32ビットフックを適用した場合も同じですが、64ビットであるためWindowsは実際には使用できませexplorer.exe
ん。両方のフックを設定すると、システムは停止状態になり、グローバルな「ビットネス」の戦いが発生します。
ここで、この問題は、たとえば64ビットフックDLLが32ビットプロセスに注入されようとしていることなどから発生していると思いますが、これはもちろん意味がありません。ただし、この場合、のドキュメントにSetWindowsHookEx()
は次のように記載されています。
フックはアプリケーションのコンテキストで実行されるため、アプリケーションの「ビットネス」と一致する必要があります。32ビットアプリケーションが64ビットWindowsにグローバルフックをインストールする場合、32ビットフックは各32ビットプロセスに挿入されます(通常のセキュリティ境界が適用されます)。64ビットプロセスでは、スレッドは引き続き「フック」としてマークされます。ただし、32ビットアプリケーションはフックコードを実行する必要があるため、システムはフックアプリのコンテキストでフックを実行します。具体的には、SetWindowsHookExを呼び出したスレッドで。これは、フックアプリケーションがメッセージを送り続ける必要があることを意味します。そうしないと、64ビットプロセスの通常の機能がブロックされる可能性があります。
テキストの太字部分はよくわかりませんが、フッキングターゲットの「ビットネス」がフックの「ビットネス」と異なる場合、実際にフックを設定したスレッドで実行されると解釈します。まったく実行できます。さらに、これは、このスレッドがまだアクティブであり、おそらく一種のメッセージループを実行している必要があることを意味します。これは正しいです?それとも私はこれを完全にやめていますか?ドキュメントには、私のシナリオで何をすべきかについての正確な指示も記載されているようです。
64ビットWindowsインストールのデスクトップにすべてのアプリケーションをフックするには、それぞれ適切なプロセスから32ビットグローバルフックと64ビットグローバルフックをインストールし、通常のブロックを回避するために、フックアプリケーションでメッセージをポンピングし続けるようにしてください機能しています。
しかし、それでも私は自分の実装で何をしなければならないかを理解できていません。最後にいくつかのコードを示すために、システム全体のキーフックを設定しようとするこの基本的な例を見てみましょう。スレッドのコードの作成は無関係である必要があると思います。
volatile static bool runThread = false;
DWORD WINAPI threadStart(LPVOID lpThreadParameter) {
HMODULE hMod = LoadLibraryA(is64Bit() ? "keyhook.x64.dll" : "keyhook.x86.dll");
HHOOK hHook = SetWindowsHookExA(WH_KEYBOARD, (HOOKPROC)GetProcAddress(hMod, "hookProc"), hMod, 0)));
runThread = true;
while(runThread) {
// Message pump? Yes? No? How?
Sleep(10);
}
UnhookWindowsHookEx(hHook);
FreeLibrary(hMod);
return 0;
}
フック自体は非常に些細なものに保たれています-ビットネスを越えるときにハングアップの問題を引き起こすのに十分です:
extern "C" LRESULT hookProc(int code, WPARAM wParam, LPARAM lParam) {
if(code == HC_ACTION) {
}
return CallNextHookEx(nullptr, code, wParam, lParam);
}
今、頭に手をかざす人もいると思いますが、フックを使った作業はめったにないことがわかります;)
しかし、それがまさに私が尋ねている理由です:)
簡潔に言うと、64ビットWindowsでシステム全体のキーフックを機能させるために上記の例を変更する方法を誰かに教えてもらえれば幸いです。私の問題は、フック以外の「ビットネス」を持つ特定のアプリケーションがハングし始め、問題を解決する方法がわからないことです。
どんな助けでも大歓迎です!
ありがとう、よろしく
PuerNoctis