3

我尝试将 WM_LBUTTONDOWN 和 WM_LBUTTONUP 消息发送到窗口(模拟鼠标单击而不移动光标)。

我的程序在许多窗口上都运行得很好,但也有一些不起作用:(比如注册表编辑器、雅虎通、一些 Firefox 站点等...

我怎样才能与上面的人一起工作?

注意#1:我使用Win7

注意#2:我的代码只是调用 api 和函数并将它们应用到特定的窗口句柄上。它工作正常,但不是在所有窗口上:(

4

2 回答 2

4

这是 UAC 的另一个方面,称为 UIPI 或用户界面隐私隔离,可能会导致此问题。旨在防止运行未提升的程序劫持提升的程序的功能。这当然解释了 Regedit.exe 的问题,如果程序可以强行将内容插入注册表,那么 UAC 显然是无效的。您必须运行提升的程序才能绕过此限制。

另一个是 SendMessage() 没有正确模拟鼠标输入。您发送的消息通常会发布到消息队列中。您需要使用 PostMessage() 代替。您还应该模拟 WM_MOUSEMOVE。

模拟鼠标输入的正确方法是通过 SendInput()。那个完全模拟鼠标驱动程序的行为,程序无法区分。但是还有一个额外的要求,即您必须确保您尝试自动化的任何程序都在前台运行。这非常困难,SetForegroundWindow() 不够可靠。因此,如果您实际上只想将鼠标消息发送到前台窗口,则只考虑 SendInput(),无论它可能是什么。

于 2012-05-12T10:46:45.297 回答
0

您可以调用SwitchToThisWindow而不是SetForegroundWindow,这要好得多,并且在大多数情况下都可以使用,然后调用SendInputor mouse_event,这更舒服,因为您根本不处理结构。

于 2016-03-05T10:30:52.353 回答