C/C++ Windows平台 模拟键盘 / 鼠标操作

11 篇文章 2 订阅

原理:调用Windows API
头文件: Windows.h


鼠标

参考:MSDN :mouse_event function

  • 按键

    使用定义在Winuser.h中的mouse_event函数(Windows.h中已经包含了Winuser.h)该函数定义如下:

    void mouse_event(
      DWORD     dwFlags,
      DWORD     dx,
      DWORD     dy,
      DWORD     dwData,
      ULONG_PTR dwExtraInfo
    );
    

    具体每个参数的含义以及其他信息,可以查询 MSDN : mouse_event function
    我们可以把表示鼠标点击事件的不同的DWORD值放在一个map数组里:

    int mousemap[3][2]=
        {      
        //对应的值:0x0002                   0x0004            
            {MOUSEEVENTF_LEFTDOWN,   MOUSEEVENTF_LEFTUP   },
        //         0x0020					0x0040
            {MOUSEEVENTF_MIDDLEDOWN, MOUSEEVENTF_MIDDLEUP },
        //			0x0008					0x0010
            {MOUSEEVENTF_RIGHTDOWN,  MOUSEEVENTF_RIGHTUP  }
        };
    

    这样,mousemap[0][0] 就表示按下鼠标左键,mousemap[0][1]就代表抬起鼠标左键,mousemap[1][0]表示按下鼠标滚轮键,mousemap[1][1] 表示抬起鼠标滚轮键 mousemap[2][0]表示按下鼠标右键,mousemap[2][1]表示抬起鼠标右键
    我们就可以写一个鼠标单击函数

    void MouseClick(int c)   //0:左键  1:滚轮键  2:右键
    {
        mouse_event(mousemap[c][0],0,0,0,0);
        mouse_event(mousemap[c][1],0,0,0,0);
    }
    
    • 移动

      有两种方法来写鼠标移动函数,(说鼠标移动可能不太严谨,因为我们的代码并不能让你的鼠标动起来,这是违反物理定律的,他只能让屏幕上的光标移动)第一种是使用GetCursorPos函数获取光标当前位置,再使用SetCursorPos函数设置光标位置:

      void Mouse_Move(int dx,int dy) 
      //dx: 水平方向位移,正向向右   dy:垂直方向位移,正向向下
      {
          POINT p = {0,0};
          GetCursorPos(&p);
          SetCursorPos(p.x + dx, p.y + dy);
      }
      

      这个函数先是获取光标当前的X / Y轴坐标,再在当前横纵坐标上加上水平和垂直位移dx,dy 来表示朝指定方向移动指定距离后的坐标,再配合Sleep函数延时,就可以实现自定义鼠标光标移动速度的效果。

      第二种方法是使用mouse_event函数,参考上面已经给出的定义,第一个参数dwFlags设置为MOUSEEVENTF_MOVE (对应值为0x0001),第二个和第三个参数就是dx和dy, 封装如下:

      void Mouse_Move(int dx,int dy) 
       //dx: 水平方向位移,正向向右   dy:垂直方向位移,正向向下
      {
      	mouse_event(MOUSEEVENTF_MOVE,dx,dy,0,0);
      }
      			
      

键盘

参考:MSDN : keybd_event function

  • 按键

    使用winuser.h中的keybd_event函数,该函数定义如下:

    void keybd_event(
      BYTE      bVk,
      BYTE      bScan,
      DWORD     dwFlags,
      ULONG_PTR dwExtraInfo
    );
    

    我们可以写出模拟键盘按下指定键的函数:
    第一句按下,第二句抬起,如果没写第二句那么该键会一直处于按下状态

    	void Click(int KEY)
    {
        keybd_event(KEY ,0,KEYEVENTF_EXTENDEDKEY | 0, 0);            //相当于 keybd_event(KEY,0,0,0);
        keybd_event(KEY ,0,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0) ; //相当于 keybd_event(KEY,0,2,0);
    }
    

    其中第一个参数bVk的值如下(为了方便,我这里以枚举的形式重新封装):

    enum SHORTCUT{
        CTRL  =  VK_LCONTROL,
        SHIFT =  VK_LSHIFT,
        ALT   =  VK_MENU, 
        ESC   =  VK_ESCAPE,
        WIN   =  VK_LWIN,
        BACK  =  VK_BACK,
        TAB   =  VK_TAB,
        ENTER =  VK_RETURN,
        HOME  =  VK_HOME,
        END   =  VK_END,
        DEL   =  VK_DELETE,
        INS   =  VK_INSERT,
        UP    =  VK_UP,
        DOWN  =  VK_DOWN,
        RIGHT =  VK_RIGHT,
        LEFT  =  VK_LEFT,
        F1    =  VK_F1, F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,
        PRTSC =  VK_PRINT,
        A     =  65,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
    };
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值