[英]How do I know id thread of interface window?
带有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,则该钩子有效,但无论在浏览器中还是可以使用。 我究竟做错了什么?
根据MSDN ,使用WH_KEYBOARD_LL不可能仅将一个线程作为目标:
“钩子的范围取决于钩子类型。某些钩子只能使用全局范围设置;其他钩子也可以仅针对特定线程设置,如下表所示。”
...
WH_KEYBOARD_LL仅全局
...
注意:也不能将从GetModuleHandle(NULL)到达的当前.exe过程实例作为SetWindowsHookEx的第三个参数传递(此处应为DLL句柄或NULL)。
在我的任务中,我需要这样做,以便将设置钩和KeyboardProc位于单个区域(.cpp文件)中。 我找到了答案:
1)制作全局变量processID
2)在设置挂钩方法
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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.