在两个线程中设置两个鼠标钩子

Posted

技术标签:

【中文标题】在两个线程中设置两个鼠标钩子【英文标题】:Setting two mouse hooks in two threads 【发布时间】:2014-09-25 05:42:51 【问题描述】:

我使用以下代码设置鼠标本地挂钩:

//declare hook handle global variable:
static HHOOK hhk;
//set new hook:
hhk = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseWndProc, GetModuleHandle(NULL), GetCurrentThreadId());

这里是mouseproc回调函数的代码:

LRESULT CALLBACK MouseWndProc(int nCode, WPARAM wParam, LPARAM lParam)

MOUSEHOOKSTRUCT *pMouseStruct = (MOUSEHOOKSTRUCT*)lParam;

    if(nCode < 0)
    
    return CallNextHookEx(hhk, nCode, wParam, lParam);
    

    //do something...

return CallNextHookEx(hhk, nCode, wParam, lParam);

使用上述代码,我在第一个线程中设置了本地挂钩。 在第二个线程中,我还需要设置新的本地挂钩。问题是 - 当我设置新钩子(用于第二个线程)时,全局变量 hhk 将被覆盖。并且第一个钩子的 mouseproc 现在使用错误的钩子句柄。对? 那么我必须传递什么作为 CallNextHookEx() 函数的第一个参数?

【问题讨论】:

所以使用两个变量。 在这种情况下,mouseproc 函数如何确定其变量? 为什么在调用SetWindowsHookEx 时将MouseWndProc 转换为HOOKPROC 声明两个钩子程序MouseWndProc1MouseWndProc2。其中一个调用MouseWndProcCommon(hhk1, nCode, wParam, lParam),另一个调用MouseWndProcCommon(hhk2, nCode, wParam, lParam) 【参考方案1】:

你不需要知道钩子过程中的HHOOK值,因为CallNextHookEx忽略了第一个参数(所以你可以只传递NULL作为第一个参数)。

您需要分别保存两个句柄,以便稍后使用UnhookWindowsHookEx 移除两个挂钩。

【讨论】:

以上是关于在两个线程中设置两个鼠标钩子的主要内容,如果未能解决你的问题,请参考以下文章

钩子和线程,鼠标阻塞

如何在 C# 中的控制台应用程序中设置鼠标光标的位置?

钩子编程(HOOK) 屏蔽全部按键鼠标及系统功能键

(转)OL2中设置鼠标的样式

Winform中设置ZedGraph鼠标焦点位置画出十字线并在鼠标移出时十字线消失

JAVA中设置鼠标点击事件怎么设置啊?为啥没反应?跪谢