有gui的第三方进程,其中多个线程在运行。需要将键盘钩子设置为线程gui这个过程。我这样做:
processID = 8888; //pid
HWND hWnd = GetForegroundWindow();
DWORD threadID = GetWindowThreadProcessId(hWnd, &processID);
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)&KeyboardProc, GetModuleHandle(NULL), threadID);
processId
从任务管理器手动插入(用于调试,然后他将返回脚本)。如果我将最后一行的threadID
选项替换为0,则钩子可以正常工作,但无处不在 - 即使在浏览器中也是如此。我做错了什么?
答案 0 :(得分:0)
根据MSDN,不可能只使用WH_KEYBOARD_LL来定位一个线程:
“钩子的范围取决于钩子类型。可以设置一些钩子 只有全球范围;其他人也可以只设置一个特定的 线程,如下表所示。“
...
WH_KEYBOARD_LL仅限全球
...
注意:也无法将当前的.exe proceess实例从GetModuleHandle(NULL)传递到SetWindowsHookEx的第三个参数(此处需要DLL句柄或NULL)。
答案 1 :(得分:-2)
在我的任务中,我被要求这样做,set hook和KeyboardProc已经位于单个区域(.cpp文件)中。我找到了答案:
1)制作全局变量processID
2)在set hook方法中
processID = GetCurrentProcessId();
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)&KeyboardProc, NULL, 0);
3)在KeyboardProc方法中:
DWORD actProcess;
HWND hwnd = GetForegroundWindow();
GetWindowThreadProcessId(hwnd, &actProcess);
if (nCode == HC_ACTION)
{
if (processID == actProcess)
{
//do something
}
}