C++ 如何知道接口窗口的id线程?

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

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,则钩子可以工作,但在任何地方都可以工作,甚至在浏览器中也可以。我做错了什么?

根据以下说明,不可能只针对一个线程:

钩子的范围取决于钩子类型。可以设置一些挂钩 只有全球范围;也可以仅为特定的项目设置其他项目 螺纹,如下表所示

仅限全球通用键盘


注意:也不能将从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的线程至少要减去什么?您不能对特定线程使用低级键盘挂钩。你有目的的回答是一个混乱的问题,这可能是这个思考过程的结果:哦,哇,低水平!我就是这样。无论如何,它并没有解决这个问题,你的问题可能甚至没有问你真正的问题。