WinAPI 鼠标点击无法正常工作

Posted

技术标签:

【中文标题】WinAPI 鼠标点击无法正常工作【英文标题】:WinAPI mouse click does not work properly 【发布时间】:2016-01-25 23:11:14 【问题描述】:

我正在用 C++ (Windows 7) 创建程序,该程序通过读取其屏幕并发送回鼠标信号(仅左键单击)来控制一个特定窗口。我显然在使用 WinAPI。问题在于鼠标信号。我的目标是在实际光标位置上独立发送鼠标事件。 (即它可以在“背景”上运行,并且窗口不必是可见的)。

我尝试了使用 SendMessage(或 PostMessage)的明显解决方案:

PostMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(x, y));
this_thread::sleep_for (std::chrono::milliseconds(100));
PostMessage(hwnd, WM_LBUTTONUP  , MK_LBUTTON, MAKELPARAM(x, y));

我认为这些命令可以正常工作,但应用程序处理点击事件的方式存在一些问题。似乎它没有考虑参数 x,y 而是当调用WM_LBUTTONUP 时,它会询问操作系统光标在哪里并单击该位置。所以最后点击总是发生在光标的位置(如果它在窗口内)。

我也尝试在WM_LBUTTONUP 之前发送WM_MOUSEMOVE 事件,但没有帮助。

这种行为真的很奇怪,我完全责怪应用程序而不是 WinAPI。任何想法如何解决这个问题?我可以以某种方式欺骗窗口,让它认为光标在别处吗?

【问题讨论】:

“有什么办法解决这个问题吗?” - 如果您的目标应用程序正在检索当前鼠标位置,而不是使用随消息传递的坐标,那么您需要修复目标应用程序。 试试SendInput 为什么人们会痴迷于这个想法,即伪造输入将是自动化 UI 的好选择,而不是直接解决方案并使用 UI Automation?它的存在是有原因的。 @milevyo:SendInput 要求应用程序可见、前景窗口和所需位置不被任何其他窗口遮挡。无需尝试。 @IInspectable,同意,但我从未见过一个有效的例子。你能发一个吗? @milevyo 真的,你找不到网络搜索 UI 自动化的例子吗? 【参考方案1】:

如果这是您唯一需要的,那么 use SendInput 使用 MOUSEINPUT 结构。

如果您想了解原因,请继续阅读。您正在做的事情不起作用,因为鼠标消息很特殊。它们不是在消息队列中到达并等待您的常规消息。当您致电GetMessage 时,它们会按需合成,因此它们会从一个秘密、隐藏的地方获取数据。事实上,一般来说,输入消息的处理方式与发布的消息不同。 Here 是 some reading 材料。

【讨论】:

SendInput 生成输入的方式与硬件驱动程序相同。由于您不能用物理鼠标单击不可见的窗口(问题的要求),因此调用SendInput 生成的输入也不能。所以这不是一个选择。您对输入消息的描述也不准确。 WM_LBUTTONDOWN/UP 消息发布到输入队列。 WM_MOUSEMOVE 消息按需生成。 @IInspectable :您必须激活窗口。我没有解决那个问题。如果窗口不活动,您不想注入输入,无论方法如何。曾经。例如,恢复窗口可能会给出不同大小的窗口或不同的窗口内容。问题是关于 x 和 y,我的答案就是原因。 您不必激活窗口。您必须为工作选择正确的工具。要自动化 UI,UI Automation 是正确的工具。

以上是关于WinAPI 鼠标点击无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

WinAPI - 钩住鼠标

C# CefSharp封装的浏览器触摸获得焦点,有光标。无法输入中文。鼠标点击后正常。求解答谢谢!

VMWare 鼠标无法点击 的问题

事件内部功能无法正常工作

为啥我电脑在桌面点击鼠标右键不出菜单?

在后台窗口中模拟鼠标点击