• 模拟鼠标事件


          模拟鼠标事件,一般可以通过mouse_event()和SendInPut()两种方法。mouse_event()在windows后期版本中逐渐被SendInPut()取代。SendInPut()模拟鼠标移动的事件中,标志位取值不同,输入坐标的意义也不同。简单来说就是,添加MOUSEEVENTF_ABSOLUTE标志位表示鼠标移动是通过绝对坐标定位,此时的坐标要通过转换。光标在屏幕中被分成65535个小块,可以通过如下转换:

    1 double fx = x *(65535.0f / fScreenWidth);
    2 double fy = y *(65535.0f / fScreenHeight);

          若不使用MOUSEEVENTF_ABSOLUTE标志位,则坐标是相对前一坐标的位移。

         SendInPut()鼠标时间使用结构如下:

    1 typedef struct tagMOUSEINPUT {
    2     LONG    dx;
    3     LONG    dy;
    4     DWORD   mouseData;
    5     DWORD   dwFlags;
    6     DWORD   time;
    7     ULONG_PTR dwExtraInfo;
    8 } MOUSEINPUT, *PMOUSEINPUT, FAR* LPMOUSEINPUT;

         msdn中完整解释如下:
         dx 鼠标的绝对位置,或自上次鼠标事件的运动量产生的dwFlags成员的值而定。鼠标的x坐标被指定为绝对的数据,相对于被指定为数据的移动像素数。
         dy 鼠标的绝对位置,或自上次鼠标事件的运动量产生的dwFlags成员的值而定。鼠标的y坐标被指定为绝对的数据,相对于被指定为数据的移动像素数。
         mouseData 如果dwFlags中包含MOUSEEVENTF_WHEEL,mouseData指定滚轮运动的量。正值表示滚轮向前旋转,即远离用户,负值表示滚轮向后旋转,即朝向用户。滚轮被定义为WHEEL_DELTA,这是120。 

         下面代码演示了鼠标的几个具体操作。
         1、我怎样才能在应用程序中模拟鼠标事件?

         有两个API函数可以使用:mouse_event()和SendInput();

         2、应该使用哪个API函数?

         在Windows NT/2000/XP中,mouse_event()函数已经被SendInput()函数已被取代的。因此,在这些操作系统上,你应该使用SendInput()函数。(除非你需要提供向后兼容性与Windows98等)。

         3、如何使用SendInput()函数来模拟点击鼠标左键?

     1 void LeftClick ( )
     2 {  
     3     INPUT    Input={0};
     4     // 左键按下
     5     Input.type      = INPUT_MOUSE;
     6     Input.mi.dwFlags  = MOUSEEVENTF_LEFTDOWN;
     7     ::SendInput(1,&Input,sizeof(INPUT));
     8 
     9     // 左键抬起
    10     ::ZeroMemory(&Input,sizeof(INPUT));
    11     Input.type      = INPUT_MOUSE;
    12     Input.mi.dwFlags  = MOUSEEVENTF_LEFTUP;
    13     ::SendInput(1,&Input,sizeof(INPUT));
    14 }

           4、如何使用SendInput()函数来模拟点击鼠标右键?

     1 void RightClick ( )
     2 {  
     3     INPUT    Input={0};
     4     // 右键按下
     5     Input.type      = INPUT_MOUSE;
     6     Input.mi.dwFlags  = MOUSEEVENTF_RIGHTDOWN;
     7     ::SendInput(1,&Input,sizeof(INPUT));
     8 
     9     // 右键抬起
    10     ::ZeroMemory(&Input,sizeof(INPUT));
    11     Input.type      = INPUT_MOUSE;
    12     Input.mi.dwFlags  = MOUSEEVENTF_RIGHTUP;
    13     ::SendInput(1,&Input,sizeof(INPUT));
    14 }

           5、如何使用SendInput()函数模拟鼠标的移动?

     1 void MouseMove (int x, int y )
     2 {  
     3     double fScreenWidth    = ::GetSystemMetrics( SM_CXSCREEN )-1; 
     4     double fScreenHeight  = ::GetSystemMetrics( SM_CYSCREEN )-1; 
     5     double fx = x*(65535.0f/fScreenWidth);
     6     double fy = y*(65535.0f/fScreenHeight);
     7     INPUT  Input={0};
     8     Input.type      = INPUT_MOUSE;
     9     Input.mi.dwFlags  = MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE;
    10     Input.mi.dx = fx;
    11     Input.mi.dy = fy;
    12     ::SendInput(1,&Input,sizeof(INPUT));
    13 }

          6、如何使用SendInput()函数来模拟点击鼠标中键?

    1 void MiddleClick()
    2 {
    3     INPUT    Input={0};
    4     // 设置滚轮量
    5     Input.type      = INPUT_MOUSE;
    6     Input.mi.dwFlags  = MOUSEEVENTF_WHEEL;
    7     Input.mi.mouseData = 500;
    8     ::SendInput(1,&Input,sizeof(INPUT));
    9 }
  • 相关阅读:
    find ./ -type d ! -name "."
    Linux入门-进程、计划任务
    Linux入门-用户管理
    Linux入门-shell使用技巧
    Linux入门-压缩、解压
    Linux入门-常用命令
    MySQL杂项(索引注意事项 快速导入导出数据 锁 字符集 慢查询)
    MySQL分区实验
    Lvs网络负载均衡 直接路由(dr)
    Lvs网络负载均衡 隧道(ip tunl)
  • 原文地址:https://www.cnblogs.com/hwm520hlf1314/p/3464737.html
Copyright © 2020-2023  润新知