C++ 如何知道接口窗口的id线程?
gui中有第三方进程,其中运行多个线程。需要设置键盘钩子来执行此过程。我的工作如下:C++ 如何知道接口窗口的id线程?,c++,multithreading,winapi,hook,C++,Multithreading,Winapi,Hook,gui中有第三方进程,其中运行多个线程。需要设置键盘钩子来执行此过程。我的工作如下: processID = 8888; //pid HWND hWnd = GetForegroundWindow(); DWORD threadID = GetWindowThreadProcessId(hWnd, &processID); hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)&KeyboardProc, GetModule
processID = 8888; //pid
HWND hWnd = GetForegroundWindow();
DWORD threadID = GetWindowThreadProcessId(hWnd, &processID);
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)&KeyboardProc, GetModuleHandle(NULL), threadID);
processId从任务管理器手动插入以进行调试,然后他将返回到脚本。如果将最后一行上的threadID选项替换为0,则钩子可以工作,但在任何地方都可以工作,甚至在浏览器中也可以。我做错了什么?根据以下说明,不可能只针对一个线程:
钩子的范围取决于钩子类型。可以设置一些挂钩
只有全球范围;也可以仅为特定的项目设置其他项目
螺纹,如下表所示
仅限全球通用键盘
注意:也不能将从GetModuleHandleNULL到达的当前.exe进程实例作为第三个参数传递给SetWindowsHookEx DLL句柄,此处应为NULL。在我的任务中,我必须这样做,以便将set hook and KeyboardProc定位在单个区域.cpp文件中。我找到了答案: 1个全局可变进程ID 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
}
}
你的问题是什么?您要问的唯一一个真正的问题是:为什么这个API的行为像?对于低级键盘挂钩,您不需要编译或使用DLL。文档中指出了这一点:这个钩子是在安装它的线程的上下文中调用的。调用是通过向安装钩子的线程发送消息来完成的。因此,安装钩子的线程必须有一个消息循环。那么,如何过滤以只接受从第三方进程到达的那些被截获的线程呢。该钩子在确定接收器之前被调用,这也是您无法为特定线程安装它的原因。谢谢,因此,实际上必须使用WH_GETMESSAGE来截取排列到特定线程/窗口的消息。有趣的是,MSDN说所有全局钩子函数都必须在库中,但WH_KEYBOARD_LL是一个全局钩子,所以仍然需要DLL。另外,不幸的是,MSDN并没有提到执行GetMsgProc的线程至少要减去什么?您不能对特定线程使用低级键盘挂钩。你有目的的回答是一个混乱的问题,这可能是这个思考过程的结果:哦,哇,低水平!我就是这样。无论如何,它并没有解决这个问题,你的问题可能甚至没有问你真正的问题。