我编写了一个应用程序,可以检测所有活动的 Windows 并将它们放入列表中。
是否有一种方法可以在不移动光标的情况下模拟点击与 Windows 位置相关的屏幕上的某个点?
我无法访问应该被点击的按钮句柄,只能访问窗口的句柄。
是否有一种方法可以在不移动光标的情况下模拟点击与 Windows 位置相关的屏幕上的某个点?
我无法访问应该被点击的按钮句柄,只能访问窗口的句柄。
SendInput()
(或在较旧的系统上使用mouse_event()
)。但是,这些函数将模拟的事件注入到与实际鼠标驱动程序发布到的相同输入队列中,因此它们将对鼠标光标产生物理影响- 即使将其移动到屏幕上等等。如何在没有SendInput的情况下模拟输入?
当你调用SendInput时,你正在将输入数据包放入系统硬件输入队列中。(注意:这不是官方术语。今天我只是这样称呼它。)这是硬件设备驱动程序堆栈在物理设备报告事件时使用的相同输入队列。SendInput操作在输入栈的最底层。它只是键盘和鼠标驱动程序使用的相同输入机制的后门,用于告诉窗口管理器用户已经生成了输入。SendInput函数不知道输入会发生什么。这由窗口管理器的更高级别处理,例如组件,用于命中测试鼠标输入以查看消息最初应该传递到哪个窗口。
直接向其发送 WM_LBUTTONDOWN
和 WM_LBUTTONUP
消息。或者,在标准的 Win32 按钮控件情况下,发送单个 BM_CLICK
消息。
使用 UI Automation API 的 AccessibleObjectFromWindow()
函数访问控件的 IAccessible
接口,然后调用其 accDoDefaultAction()
方法,对于按钮将点击它。
话虽如此,...
我无法访问应该被点击的按钮的句柄。
您可以访问任何具有 HWND
的内容。例如,看一下 WindowFromPoint()
。您可以使用它来查找占用所需屏幕坐标的按钮的 HWND
(当然,这带有一些警告:WindowFromPoint、ChildWindowFromPoint、RealChildWindowFromPoint,这将何时结束?)。
HWND
不是Win32按钮,则无法使用BM_CLICK
。但是,您仍将拥有真正的HWND
,并且将向其发送WM_LBUTTON...
以在需要时向其持有的任何非窗口控件传递。但是,如果它支持UI自动化,那也很有帮助,因为您将能够枚举其不可访问的子控件。 - Remy Lebeau
SetForegroundWindow
。 - Barmak Shemirani