第3节 鼠标移动/点击事件


日期: 2000-07-06 14:00 | 联系我
关注我: Telegram, Twitter

  鼠标的自动移动/点击功能的自动模拟测试程的一个重要功能。有很多种方法能够实现鼠标的移动和点击。这里讲述两个API函数:

SetCursorPos
The SetCursorPos function moves the cursor to the specified screen 
coordinates. If the new coordinates are not within the screen 
rectangle set by the most recent ClipCursor function call, 
the system automatically adjusts the coordinates so that 
the cursor stays within the rectangle. 

BOOL SetCursorPos(
  int X,  // horizontal position
  int Y   // vertical position
);
  SetCursorPos设置鼠标位置。参数表示鼠标指针在屏幕像素坐标系统中的X,Y位置

  这个函数是用来设置Mouse位置的。可以用这个函数来移动mouse在屏幕上的移动。

  另外一个函数功能比较强,即mouse_event(). 不过此程序在 windows 2000/NT/XP系统中, 应该用 SendInput 代替

mouse_event
The mouse_event function synthesizes mouse motion and button clicks. 
Windows NT/2000/XP: This function has been superseded. Use SendInput instead.

VOID mouse_event(
  DWORD dwFlags,         // motion and click options
  DWORD dx,              // horizontal position or change
  DWORD dy,              // vertical position or change
  DWORD dwData,          // wheel movement
  ULONG_PTR dwExtraInfo  // application-defined information
);

  设置mouse状态。参数说明如下:

  • dwFlags Long,下述标志的一个组合 :

  • MOUSEEVENTF_ABSOLUTE dx和dy指定鼠标坐标系统中的一个绝对位置。在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元

  • MOUSEEVENTF_MOVE 移动鼠标

  • MOUSEEVENTF_LEFTDOWN 模拟鼠标左键按下

  • MOUSEEVENTF_LEFTUP 模拟鼠标左键抬起

  • MOUSEEVENTF_RIGHTDOWN 模拟鼠标右键按下

  • MOUSEEVENTF_RIGHTUP 模拟鼠标右键按下

  • MOUSEEVENTF_MIDDLEDOWN 模拟鼠标中键按下

  • MOUSEEVENTF_MIDDLEUP 模拟鼠标中键按下

  • dx 根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定水平方向的绝对位置或相对运动

  • dy 根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定垂直方向的绝对位置或相对运动

  • dwData amount of wheel movement

  • dwExtraInfo,通常未用的一个值。用GetMessageExtraInfo函数可取得这个值。可用的值取决于特定的驱动程序。
  例如:将mouse移动到坐标(450,100) 可用下面的函数实现:

 SetCursorPos(450,100);
 mouse_event(MOUSEEVENTF_MOVE ,0,450,100,GetMessageExtraInfo());
  实现鼠标单击:
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,GetMessageExtraInfo());
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,GetMessageExtraInfo ());

  那么,如何模拟mouse不断的移动和点击呢?可以使用定时器完成。

  以Windows C 程序为例, 在初始化程序的时候,设置时钟:

...
 case WM_CREATE:
   ...
   SetTimer(1, 1000, NULL);
   break;
  这样就设置了ID号为1 的时钟事件, 它每秒(1000毫秒)将产生一个 WM_TIMER事件。

  然后我们在WM_TIMER事件中将入相关的处理:


case WM_TIMER:
 {
   ...
   // mouse move code...
   // mouse click code...
   break;
 }
  在Delphi中,时钟是通过一个Timer控件实现的。

  关于时钟事件的运用在此软件中是很基本的一个概念。几乎所有的工作都是在时钟事件中完成的。如需进一步的了解时钟的用法,请查阅相关资料。

  如何实现程序自动滚屏?

  有这么几种方法,我都试过:

  1. 找到目标程序的当前窗口后,向其发送 Scrool消息。
  2. 找到IE的Scrool消息,结合前面的mouse点击方式,自动点击scroll条

  3. 如果是网页程序,IE 的话,可以调用其com接口。使用 IHTMLDocument接口,调用put_scrollTop即可完成。主要文档可参阅 msdn. 那些以 IHTMLxxxxxx开头的都是IE的COM接口。

  如何自动输入文字?

  测试程序时,需要输入测试用例(例如文本或数字), 则在找到要输入文字的控件句柄之后, 发送 WM_SETTEXT 消息即可.


 文章评论

第 1 楼  发表于 2010-01-29 10:52 | eastley 的所有评论
看过

第 2 楼  发表于 2010-03-16 02:57 | 清舞 的所有评论
想找个可以设置控制点击时间的鼠标点击器。精确到豪秒级别的。斑竹有办法不?

第 3 楼  发表于 2010-07-15 19:07 | 大神 的所有评论
写得很好很详细,程序员小强啊

共有评论 3 条, 显示 3 条。

当前页面是本站的 百度 MIP 版本。
欲查看完整版本和发表评论请点击:完整版 »

 

程序员小辉 建站于 1997
Copyright © XiaoHui.com; 保留所有权利。