原理:调用Windows API
头文件: Windows.h
鼠标
-
按键
使用定义在
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 };