为什么SendMessage()函数不起作用?

时间:2012-05-12 10:24:13

标签: windows api click sendmessage simulate

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

我的程序在许多窗口上工作得非常好,但有一些不起作用 :( 像注册表编辑器,Yahoo Messenger,一些Firefox网站等......

如何与上述人员合作?

注意#1:我使用的是Win7

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

2 个答案:

答案 0 :(得分:4)

UAC的另一个方面,称为UIPI或用户界面隐私隔离,可能会导致此问题。旨在防止程序无法提升劫持高架程序的功能。这肯定解释了Regedit.exe的问题,显然如果一个程序可以命令它将东西戳入注册表,UAC将无效。您必须提升程序以绕过此限制。

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

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

答案 1 :(得分:0)

您可以拨打SwitchToThisWindow而不是SetForegroundWindow,这样会更好,大部分时间都有效,然后拨打SendInputmouse_event,这很多更舒服,因为你根本不处理结构。