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

我尝试发送一个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 ,这样更舒服一些,因为你根本不用处理结构。