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 鼠标点击无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章