我试图钩住一个进程的键盘,但是当我按任意键时,钩子的代码无法执行,并且进程冻结。我的代码基于以下帖子:How to hook external process with SetWindowsHookEx and WH_KEYBOARD
这是我的dll代码:
#include <windows.h>
#include <iostream>
#include <stdio.h>
HINSTANCE hinst = NULL;
#pragma data_seg(".shared")
HHOOK hhk = NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shared,RWS")
LRESULT CALLBACK wireKeyboardProc(int code, WPARAM wParam, LPARAM lParam) {
return CallNextHookEx(hhk, code, wParam, lParam);
}
extern "C" __declspec(dllexport) void install(unsigned long threadID) {
hhk = SetWindowsHookEx(WH_KEYBOARD, wireKeyboardProc, hinst, threadID);
}
BOOL WINAPI DllMain(__in HINSTANCE hinstDLL, __in DWORD fdwReason, __in LPVOID lpvReserved) {
hinst = hinstDLL;
return TRUE;
}
编辑:加载dll后,我执行函数install(),该函数成功创建了钩子,但是由于某些原因,当按下键并冻结进程时,不会执行函数wireKeyboardProc。知道为什么会这样吗?
编辑2:这也是我的exe代码:
unsigned long threadID = GetWindowThreadProcessId(hWnd, &ProcessId);
HINSTANCE hinst;
hinst = LoadLibrary(_T("hookKbd32.dll"));
if (hinst) {
typedef void(*Install)(unsigned long);
Install install = (Install)GetProcAddress(hinst, "install");
install(threadID);
}
我在向Nox播放器(Android模拟器)添加钩子时遇到了同样的问题。我已经在另一个模拟器上尝试了相同的代码,并且效果很好。
此后,我确定nox包含防钩子系统...可能与您的程序相同。在SetWindowsHookExA之后,Nox看起来冻结或退出,而根本没有捕获事件。