Win7 x64上で64ビットアプリケーションにフックするための簡単なDLLを作成しようとしています。64ビットグローバルフックが32ビットアプリケーションをロックする
私のプログラムは64ビットプロセスで動作し、キーが押されるたびにメッセージボックスを生成します。しかし、32ビットアプリケーションでキーを押すと、そのアプリケーションはフックが削除されるまでロックされます。なぜ64ビットのフックは32ビットアプリケーションに干渉しますか?
以下のコード。
hook.h
#ifdef MYHOOK_EXPORTS
#define MYHOOK_DLL __declspec(dllexport) __stdcall
#else
#define MYHOOK_DLL __declspec(dllimport) __stdcall
#endif
void MYHOOK_DLL installHook();
void MYHOOK_DLL removeHook();
hook.cpp:
#include "hook.h"
#include <windows.h>
// hook handle stored in a shared data segment
#pragma data_seg(".myshared")
HHOOK hhook = 0;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.myshared,RWS")
static HMODULE hmodule = 0;
LRESULT CALLBACK keyboardProc(int code, WPARAM wParam, LPARAM lParam) {
// Replace this with sending a message to another window or writing to a file
MessageBox(NULL, L"Hello, world!", L"Alert", 0);
return CallNextHookEx(hhook, code, wParam, lParam);
}
void MYHOOK_DLL installHook() {
if (!hhook)
hhook = SetWindowsHookEx(WH_KEYBOARD, keyboardProc, hmodule, 0);
}
void MYHOOK_DLL removeHook() {
if (hhook)
UnhookWindowsHookEx(hhook);
hhook = 0;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call,
LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
hmodule = hModule;
}
return TRUE;
}
install.cpp:
#include "hook.h"
#include <stdio.h>
int wmain() {
installHook();
getchar();
removeHook();
return 0;
}
私はあなたがどこかのフックに64ビットプロセスにしているかどうかをチェックする必要があり読んで、私はどこでどのようにしているのか分かりません。
私はWH_KEYBOARD_LLを知っていますが、DLLを注入する必要はありませんが、なぜこのフックが機能していないのか理解しようとしています。
私は64ビットシステムでWH_KEYBOARDフックの標準的な例を実装しようとしていますが、これはもっと大きなものの一部ではありません。 – acdx
表示されているキーを単純な配列にキャプチャしてみてください。それは安全でなければなりません。 –
@マーティン:それを試してみてください。それは、64ビットのアプリケーションからのキーストロークを記録し、32ビットのアプリケーションはロックアップする。明らかに64ビットでプログラムは32ビットなので、フックプロシージャは決して実行されません。 – acdx