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