我尝试将 WM_LBUTTONDOWN 和 WM_LBUTTONUP 消息发送到窗口(模拟鼠标单击而不移动光标)。
我的程序在许多窗口上都运行得很好,但也有一些不起作用:(比如注册表编辑器、雅虎通、一些 Firefox 站点等...
我怎样才能与上面的人一起工作?
注意#1:我使用Win7
注意#2:我的代码只是调用 api 和函数并将它们应用到特定的窗口句柄上。它工作正常,但不是在所有窗口上:(
我尝试将 WM_LBUTTONDOWN 和 WM_LBUTTONUP 消息发送到窗口(模拟鼠标单击而不移动光标)。
我的程序在许多窗口上都运行得很好,但也有一些不起作用:(比如注册表编辑器、雅虎通、一些 Firefox 站点等...
我怎样才能与上面的人一起工作?
注意#1:我使用Win7
注意#2:我的代码只是调用 api 和函数并将它们应用到特定的窗口句柄上。它工作正常,但不是在所有窗口上:(
这是 UAC 的另一个方面,称为 UIPI 或用户界面隐私隔离,可能会导致此问题。旨在防止运行未提升的程序劫持提升的程序的功能。这当然解释了 Regedit.exe 的问题,如果程序可以强行将内容插入注册表,那么 UAC 显然是无效的。您必须运行提升的程序才能绕过此限制。
另一个是 SendMessage() 没有正确模拟鼠标输入。您发送的消息通常会发布到消息队列中。您需要使用 PostMessage() 代替。您还应该模拟 WM_MOUSEMOVE。
模拟鼠标输入的正确方法是通过 SendInput()。那个完全模拟鼠标驱动程序的行为,程序无法区分。但是还有一个额外的要求,即您必须确保您尝试自动化的任何程序都在前台运行。这非常困难,SetForegroundWindow() 不够可靠。因此,如果您实际上只想将鼠标消息发送到前台窗口,则只考虑 SendInput(),无论它可能是什么。
您可以调用SwitchToThisWindow
而不是SetForegroundWindow
,这要好得多,并且在大多数情况下都可以使用,然后调用SendInput
or mouse_event
,这更舒服,因为您根本不处理结构。