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