2016-10-04 64 views
0

有gui的第三方进程,其中运行多个线程。需要将键盘挂钩设置为线程gui这个过程。我做如下:手动如何知道界面窗口的id线程?

processID = 8888; //pid 
HWND hWnd = GetForegroundWindow(); 
DWORD threadID = GetWindowThreadProcessId(hWnd, &processID); 
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)&KeyboardProc, GetModuleHandle(NULL), threadID); 

processId插入从任务管理器(用于调试,然后他将返回到脚本)。如果我将最后一行的threadID选项替换为0,该钩子就可以工作,但无处不在 - 即使在浏览器中也是如此。我究竟做错了什么?

+0

什么是你的问题?你问的唯一真正的问题是:*“为什么这个API的行为如[记录](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990.aspx)?”* – IInspectable

回答

0

根据MSDN这是不可能的目标只有一个线程与WH_KEYBOARD_LL:

“挂钩的范围取决于挂钩型一些挂钩可以设置 仅具有全局范围;别人做不到也只能针对特定的 线程进行设置,如下表所示。“

...

WH_KEYBOARD_LL全球唯一

...

注:也可以不通过从的GetModuleHandle(NULL)到达作为第三个参数,以当前的.exe proceess实例SetWindowsHookEx(DLL句柄或NULL预计在这里)。

+1

您不需要编译或使用DLL的低级别键盘钩子。这在文档中指出:*“这个钩子是在安装它的线程的上下文中调用的,这个调用是通过向安装钩子的线程发送消息来完成的,因此,安装钩子的线程必须有一个消息循环。“* – IInspectable

+0

那么,如何过滤只接受从第三方进程截获的拦截? –

+1

对于低级别的鼠标钩,您不能。该钩子在**接收器被确定之前称为**(这也是您无法为特定线程安装它的原因)。 – IInspectable

-2

在我的任务中,我被要求这样做,以便set hook和KeyboardProc已经位于单个区域(.cpp文件)中。我找到了答案:

1)全球制造varible 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 
    } 
} 
+0

写入至少减去什么? –

+0

对于特定线程,您不能使用**低级**键盘挂钩。你的目标是回答问题,这可能是这个思考过程的结果:*“哦,哇,**低级**!这就是我。”*无论如何,它不解决问题,你的问题可能是甚至不问你的**真实**问题。 – IInspectable

相关问题