我如何知道界面窗口的id线程?

时间:2016-10-04 11:37:19

标签: c++ multithreading winapi hook

有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,则钩子可以正常工作,但无处不在 - 即使在浏览器中也是如此。我做错了什么?

2 个答案:

答案 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
  } 
 }