关于鼠标的自动控制 舒辉 康绯 2001年 41期 所谓鼠标的自动控制是指通过程序来控制鼠标在应用程序的窗口上移动或者自动点击应用程序中的按钮、超级链接及其他一些窗口对象等。这在实际中有着很广泛的用途,比如对于一些需要频繁鼠标点击的应用程序,用程序实现鼠标的自动点击,可以使我们从繁重的手工操作中解脱出来;对于一些需要动态演示的CAI教学软件,鼠标的自动控制也是关键技术之一。   本文主要讨论用VB实现鼠标自动控制中一些主要技术,包括编程方法、常用API函数以及一种必要的工具软件(Spy++),读者在了解了这些编程技术之后,可以根据需要针对不同应用程序编写相应的自动控制程序。   #1鼠标的自动移动   VB中有一个关于鼠标定位的API函数SetCursorPos就可以实现鼠标的自动移动,下面是该函数在VB中的声明:   Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long   该函数带两个参数x和y,表示鼠标在屏幕上的坐标,用该函数可以将鼠标移到屏幕上的任何地方,例如对于1024×768分辨率的屏幕,一个典型的VB子程序如下:   Public Sub MouseRndMove()   Dim posx, posy As Integer   posx = Int((1023 * Rnd) + 1)   posy = Int((767 * Rnd) + 1)   SetCursorPos posx, posy   End Sub   该函数用posx和posy两个变量表示鼠标位置的横坐标和纵坐标,VB中随机函数Rnd可产生0到1之间的随机小数,通过子程序中给出的公式就可以计算出屏幕范围内的随机坐标点。该函数一般在VB中的定时器TIMER来定时调用,这样就可以实现鼠标的定时移动。   #1鼠标的自动点击   在实现鼠标的自动点击中需要解决两个问题:确定被点击的窗口对象(如按钮、链接等)在屏幕上的位置和向窗口对象发送鼠标点击消息。   对此,我们首先要借助一些软件工具来弄清楚窗口对象的某些信息。我们在这里用Spy++来进行分析(Spy++是Visual Studio 6.0工具集中的一个软件工具),我们举一个简单的例子来说明一下分析的过程。   (^41020505a^)是一个简单的VB应用程序窗口,包含一个标题为“点击我”的按钮。   在运行该程序之后,运行Spy++,点击Search菜单中Find Window子菜单,出现如图2(^41020505b^)所示的画面,画面中用圆圈圈出的东东俗称“窗口探测器”,用鼠标将该探测器拖到要点击的应用程序窗口上面,放开鼠标后,点击图中对话框的OK按钮,可得到如图3(^41020505c^)所示的画面。   图3中选中部分表示应用程序的主窗口Form1的相关信息,数字部分是窗口的当前句柄,引号内表示窗口的标题,最后是窗口的类名。从图中还可以看出,主窗口中还有下一级子窗口,也就是图1中的“点击我”按钮,其类名为ThunderRT6CommandButton。要对该按钮进行鼠标自动点击必须针对该按钮的句柄来进行。   从Spy++中获取应用程序窗口的层次信息以及各级窗口的类名,就可以开始实现广告条的自动点击了。同样以中点击应用程序按钮为例:首先用Windows API函数FindWindow根据应用程序窗口的类名ThunderRT6FormDC得到其句柄,根据其句柄用FindWindowEx函数查找并获取与类名ThunderRT6CommandButton相匹配的子窗口(即按钮)的句柄,再根据按钮的句柄用GetWindowRect函数获取按钮在屏幕中具体的位置,用SetCursorPos函数将鼠标定位到窗口中心,然后对该按钮用PostMessage函数发送鼠标按下和弹起两个消息,如此用程序进行鼠标点击就实现了。   前文只是一个简单的例子,实际应用程序中窗口的层次结构可能会很复杂,不过只要用Spy++工具仍可以对程序完成全面的分析,只要弄清楚要点击的对象在窗口层次结构中的位置,就可以通过上述一系列API函数的运用,找到点击对象的句柄,确定其位置,并向它发送鼠标按下和弹起消息完成自动点击。   有一点需要指出的是,PostMessage在发送鼠标按下或弹起消息时,函数参数中包含鼠标的坐标,但在VB中调用该API函数时,坐标参数将得不到正确地传递(原因较为复杂),这对于某些窗口对象,比如浏览器中的链接,如果它接受到鼠标按下或弹起消息,但鼠标的坐标与其本身在屏幕上的位置不符,则点击就会失效。不过我们通过试验发现,在VC中调用PostMessage函数,鼠标的坐标参数可以得到正确的传递。一种较简单的做法是在VC中生成一个关于鼠标点击的小动态链接库,然后在VB中调用,这样可以避免完全用VC实现造成的编程麻烦。   #1附带的问题   进行鼠标自动控制的目的往往是为了自动完成应用程序的某些功能,那么首先需要能够自动启动执行应用程序,这在VB中比较简单,VB中有一个专门的shell函数来完成这一功能,比如我们要用程序自动加载notepad.exe程序,在VB中只要一句话就实现了:   Shell “notepad.exe”, vbNormalFocus   在进行鼠标的自动点击时,往往会产生许多额外的窗口,比如对浏览器中链接的点击,将会产生新的IE窗口,一般需要能够将其自动关闭,这在VB中也可以简单实现:用PostMessage向要关闭的IE窗口发送WM_CLOSE消息即可,下面是一个关闭IE窗口的子程序。对于其他类型的窗口用类似的方法也可以关闭。   Public Sub CloseIEWindow()   Dim IEWindow As Long   IEWindow = FindWindow("IEFrame","")   If IEWindow Then   PostMessage IEWindow(WM_CLOSE,0,0) WM_CLOSE=&H10   End If   End Sub