我在VC++中写了键盘勾子程序,但当我把鼠标点到任务栏后,钩子程序就失去效果。请问啥原因呢?有啥解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我在VC++中写了键盘勾子程序,但当我把鼠标点到任务栏后,钩子程序就失去效果。请问啥原因呢?有啥解决相关的知识,希望对你有一定的参考价值。

你是用动态链接库写的吗??还是就是在本程序里?一般来说任务栏不属你的程序管,所以不受控制。
如果你想要控制整个计算机,那得用动态链接库。做成一个全局的钩子
我之前写过,不小心把电脑全屏蔽了,只好强制关机,呵呵···
参考技术A 无代码无真相 参考技术B 你的钩子是否是一个全局钩子?

捕捉鼠标位置

【中文标题】捕捉鼠标位置【英文标题】:Capture Mouse Position 【发布时间】:2013-12-18 19:05:32 【问题描述】:

这是一个Win32程序,我写了一个CaptureMousePosition函数来捕捉鼠标的位置。

我在 WM_MOUSEMOVE 消息中调用该函数。

然后我运行程序。当我的鼠标移动到红点上时,是(126,112)。这里没有问题。

但是当我的鼠标在蓝点上移动时,它变成了(960,940)。怎么会发生,我不明白,为什么红点是(126,112),而蓝点是(960,940)。蓝色点应该是(

【问题讨论】:

我认为您的格式有问题或没有正确粘贴内容 你有没有考虑到屏幕左上角的X == 0, Y == 0 另请注意,“捕获鼠标”具有特定的技术含义,我不认为您在这里使用它。 我解决了问题,现在您可以查看问题了。 请不要发布源代码截图。只需将源代码作为文本发布。这样就可以搜索了。另外,你没有说hWndlParam 来自哪里,或者红点和蓝点是如何产生的。 (它们是子窗口吗?)您也没有说将鼠标放在两个点之间的中间,或者当您在两个点之间缓慢移动鼠标时会得到什么。 【参考方案1】:

一切都很好。蓝点的坐标是X = 96Y = 94。您看到的是X = 960,因为您没有删除X = 100 留下的0。如果您使用调试器单步执行代码,您会注意到这些值很好。

【讨论】:

【参考方案2】:

documentation for WM_MOUSEMOVE 明确指出:

使用以下代码获取水平和垂直位置:

xPos = GET_X_LPARAM(lParam); 
yPos = GET_Y_LPARAM(lParam); 

如上所述,x坐标在返回值的低位; y 坐标是高阶短(两者都表示有符号值,因为它们可以在具有多个监视器的系统上取负值)。如果将返回值分配给变量,则可以使用 MAKEPOINTS 宏从返回值中获取 POINTS 结构。您还可以使用 GET_X_LPARAM 或 GET_Y_LPARAM 宏来提取 x 或 y 坐标。

重要不要使用 LOWORD 或 HIWORD 宏来提取光标位置的 x 和 y 坐标,因为这些宏在具有多个监视器的系统上返回错误的结果。具有多个监视器的系统可以具有负的 x 和 y 坐标,并且 LOWORD 和 HIWORD 将坐标视为无符号量。

改变这个:

short nX;
nX = (short)LOWORD(lParam);
short nY;
nY = (short)HIWORD(lParam);

到这里:

short nX;
nX = GET_X_LPARAM(lParam); 
short nY;
nY = GET_Y_LPARAM(lParam); 

或者这个:

POINTS pt;
pt = MAKEPOINTS(lParam);

short nX;
nX = pt.x; 
short nY;
nY = pt.y; 

更新:documentation 中的其他注意事项:

光标移动时发布到窗口。如果未捕获鼠标,则将消息发布到包含光标的窗口。否则,消息将发布到捕获鼠标的窗口。

这意味着如果鼠标已通过SetCapture() 捕获,则报告的坐标将相对于正在捕获的窗口,而不是鼠标实际移动的窗口。

【讨论】:

对不起,它不起作用,我改变了我的代码,但它仍然像以前一样工作。 那么这就是 Windows 实际报告坐标的方式。您的WM_MOUSEMOVE 处理程序实际附加到哪个窗口?屏幕截图中的红点不位于正在绘制的客户区域的 126x112 处,而是更接近 116x116。只有当WM_MOUSEMOVE 消息相对于主窗口的左上角而不是窗口内任何客户区的左上角报告时,126x112 才有意义。 WM_MOUSEMOVE 应该报告相对于接收消息的窗口客户区的坐标。 这表明你的主窗口已经捕获了鼠标,即使它正在一个子窗口上移动。 对不起,我犯了一个愚蠢的错误,其实蓝点是(96,94),而不是(960,940),说明因为textout函数的长度,你的回答很有用对我来说,非常感谢。【参考方案3】:

如果不显示您的代码,很难回答,但我想,这个问题出在屏幕与客户端坐标之间。

【讨论】:

对不起,我没有发布图片的声誉,但我不知道为什么现在可以发布,无论如何,如果你能帮助我,我将不胜感激。 您发布的图片很好,只是您没有正确链接到它们。

以上是关于我在VC++中写了键盘勾子程序,但当我把鼠标点到任务栏后,钩子程序就失去效果。请问啥原因呢?有啥解决的主要内容,如果未能解决你的问题,请参考以下文章

鼠标坏了,怎样用键盘操作电脑呢?

ThinkPadE445键盘的红点动不了

VC/MFC怎样给菜单项添加勾啊

我在VS2008中写了个winform程序,想实现关闭按钮,就最小化到托盘

用C语言写一个控制鼠标键盘自动点的程序复杂吗

如何设置 IDEA 执行编译后任务?