1

我是自动化的忠实拥护者,所以每当我有机会尝试自动化必须重复的任务时。以下代码通常允许我在屏幕上的任何位置(以及在任何可能的应用程序中)单击鼠标:

Public Declare Auto Function SetCursorPos Lib "User32.dll" (ByVal X As Integer, ByVal Y As Integer) As Long

Public Declare Auto Function GetCursorPos Lib "User32.dll" (ByRef lpPoint As Point) As Long

Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)

Public Const MOUSEEVENTF_LEFTDOWN = &H2 ' left button down

Public Const MOUSEEVENTF_LEFTUP = &H4 ' left button up

Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 ' middle button down

Public Const MOUSEEVENTF_MIDDLEUP = &H40 ' middle button up

Public Const MOUSEEVENTF_RIGHTDOWN = &H8 ' right button down

Public Const MOUSEEVENTF_RIGHTUP = &H10 ' right button up

这通常没有问题。我已经在一系列应用程序中使用它,效果很好。但是,我现在正在尝试对似乎完全忽略鼠标和键盘命令的应用程序进行一些鼠标单击(和击键发送)。一旦鼠标移动到程序所覆盖的屏幕区域,它就不会移动、单击等,但是我手动将鼠标移开,它会继续该过程,就好像它一直在正常工作一样。

那么有没有其他方法可以以编程方式控制鼠标,以一种与我手动移动鼠标无法区分的方式模拟鼠标?

4

1 回答 1

4

你用的是什么版本的windows?

如果您使用的是 Vista+,目标应用程序是否以提升的权限运行?

如果是,您的应用程序是否也在以提升的权限运行?

如果没有,请参阅:UIPI

较新版本的 Windows 主动禁止具有较低权限的应用程序向具有较高权限的应用程序发送消息。有几种方法可以解决这个问题,要么让你的应用程序以提升的权限运行,要么包括一个设置为 true的应用程序清单。uiAccess在后一种情况下,应用程序必须经过验证码签名并且必须从受信任的位置(即:Program Files目录等)执行。

否则,如果不引入新的硬件驱动程序,就无法在低级别模拟鼠标活动。硬件驱动程序在Ring-0中运行,并且要完全模拟真实的鼠标活动(不仅仅是“假”消息),您需要在此级别进行。

于 2014-03-28T14:50:39.770 回答