繁体   English   中英

我怎么知道界面窗口的id线程?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM