在开发一些类似于向日葵或者VNC的远程桌面或者远控软件的时候,我们往往需要模拟键盘操作模拟鼠标操作。通过模拟操作,我们可以在不安装硬件外设的时候实现对电脑的控制。这里介绍一下在Windows和Linux平台下模拟鼠标键盘的实现方式,希望对有相关开发需求的人有帮助。
Windows模拟鼠标键盘操作
在windows下我们可以通过调用对应的windowsAPI实现对应的键盘鼠标操作模拟
模拟键盘操作
组合键的发送方式
#include <Windows.h>
//模拟键盘发送Ctrl+V贴操作
void SendCtrlV()
{
// Create a generic keyboard event structure
INPUT ip;
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0;
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
// Press the "Ctrl" key
ip.ki.wVk = VK_CONTROL;
ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));
// Press the "V" key
ip.ki.wVk = 'V';
ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));
// Release the "V" key
ip.ki.wVk = 'V';
ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));
// Release the "Ctrl" key
ip.ki.wVk = VK_CONTROL;
ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));
}
单键的发送方式
#include <Windows.h>
//模拟键盘发送单个的V按键
void SendCtrlV()
{
// Create a generic keyboard event structure
INPUT ip;
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0;
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
// Press the "V" key
ip.ki.wVk = 'V';
ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));
// Release the "V" key
ip.ki.wVk = 'V';
ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));
}
常用的物理按键的值列表如下:
#define VK_SHIFT 0x10 //Shift键
#define VK_CONTROL 0x11 //Ctrl键
#define VK_MENU 0x12 //Alt键
#define VK_CAPITAL 0x14 //CapsLock大小写转换键
#define VK_RETURN 0x0D //Enter回车键
#define VK_ESCAPE 0x1B //ESC键
#define VK_SPACE 0x20 //空格键
#define VK_PRIOR 0x21 //PageUp键
#define VK_NEXT 0x22 //PageDown键
#define VK_END 0x23 //End键
#define VK_HOME 0x24 //Home键
#define VK_TAB 0x09 //Tab 键
#define VK_MULTIPLY 0x6A //乘
#define VK_ADD 0x6B //加
#define VK_SEPARATOR 0x6C //除
#define VK_SUBTRACT 0x6D //减
#define VK_DECIMAL 0x6E //小数点
#define VK_SNAPSHOT 0x2C //Print Screen 键
#define VK_INSERT 0x2D //Insert键
#define VK_DELETE 0x2E //Delete键
#define VK_LBUTTON 0x01 //鼠标左键
#define VK_RBUTTON 0x02 //鼠标右键
#define VK_MBUTTON 0x04 //鼠标中键
#define VK_F1 0x70 //功能键F1-F24
#define VK_F2 0x71
#define VK_F3 0x72
#define VK_F4 0x73
#define VK_F5 0x74
#define VK_F6 0x75
#define VK_F7 0x76
#define VK_F8 0x77
#define VK_F9 0x78
#define VK_F10 0x79
#define VK_F11 0x7A
#define VK_F12 0x7B
0~9可以直接使用ASCII字符表示 '0'~'9'
a-z/A-Z也可以直接 'a'~'z' 'A'~'Z'表示
模拟鼠标移动和点击需要使用mouse_event函数
VOID mouse_event(
DWORD dwFlags, //移动和点击的标志位
DWORD dx, //水平位置
DWORD dy, //垂直位置
DWORD dwData, //滚轮位移
ULONG_PTR dwExtraInfo //应用定义的信息
);
//dwFlags常用标志信息
MOUSEEVENTF_MOVE = 0x0001; //移动鼠标
MOUSEEVENTF_LEFTDOWN = 0x0002; //模拟鼠标左键按下
MOUSEEVENTF_LEFTUP = 0x0004; //模拟鼠标左键抬起
MOUSEEVENTF_RIGHTDOWN = 0x0008; //模拟鼠标右键按下
MOUSEEVENTF_RIGHTUP = 0x0010; //模拟鼠标右键抬起
MOUSEEVENTF_MIDDLEDOWN = 0x0020; //模拟鼠标中键按下
MOUSEEVENTF_MIDDLEUP = 0x0040; //模拟鼠标中键抬起
MOUSEEVENTF_ABSOLUTE = 0x8000; //标示是否采用绝对坐标
//模拟将鼠标移动到x,y位置
void mouse_move(int x,int y)
{
mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE,x*65536/1024,y*65536/768,0,0);
}
//模拟鼠标移动到x,y位置并进行左键点击
void mouse_move_and_left_click(int x,int y)
{
mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE,x*65536/1024,y*65536/768,0,0);
mouse_event(MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_LEFTUP,0,0,0,0);
}
//模拟鼠标移动到x,y位置并进行右键点击
void mouse_move_and_right_click(int x,int y)
{
mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE,x*65536/1024,y*65536/768,0,0);
mouse_event(MOUSEEVENTF_RIGHTDOWN|MOUSEEVENTF_RIGHTUP,0,0,0,0);
}
//模拟鼠标移动到x,y并双击
void mouse_move_and_double_left_click(int x,int y)
{
mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE,x*65536/1024,y*65536/768,0,0);
mouse_event(MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_LEFTUP,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_LEFTUP,0,0,0,0);
}
Linux模拟键盘鼠标操作
在Linux下我们可以使用libXtst模拟鼠标键盘操作,通过模拟鼠标键盘操作我们可以实现自动化测试。
如果系统里面没有libXtst库,我们可以通过下面的命令进行安装
sudo apt update
sudo apt install libxtst-dev
系统安装之后我们就可以使用libXtst库了,如果是Qt工程可以通过下面的配置引入Xtst库
LIBS += -lXtst
如果是CMake项目我们可以通过下面的命令引入Xtst库
LINK_LIBRARIES(Xtst)
引入了对应的库之后我们就可以在代码中模拟键盘鼠标操作了
键盘操作
模拟单一的按键操作
#include <X11/extensions/XTest.h>
#include <X11/Xlib.h>
#include <X11/keysymdef.h>
int SimulateSingleKey()
{
Display* disp = XOpenDisplay(NULL);
if(disp == NULL)
{
return 0;
}
//模拟键盘上的A键的点击
XTestFakeKeyEvent(disp, XKeysymToKeycode(disp, XK_A), True, CurrentTime);
XTestFakeKeyEvent(disp, XKeysymToKeycode(disp, XK_A), False, CurrentTime);
XCloseDisplay(disp);
return 1;
}
模拟组合键的操作
#include <X11/extensions/XTest.h>
#include <X11/Xlib.h>
#include <X11/keysymdef.h>
void simulateMultiKey()
{
Display* disp = XOpenDisplay(NULL);
if(disp == NULL)
{
return;
}
//模拟Ctrl+A的组合键操作
int ctrl_value = XK_Control_L;
int key_value = XK_A;
KeyCode keycode = 0, modcode = 0;
keycode = XKeysymToKeycode (disp, key_value);
if (keycode == 0) return;
XTestGrabControl (disp, True);
//保持Ctrl键
if (ctrl_value != 0)
{
modcode = XKeysymToKeycode(disp, ctrl_value);
XTestFakeKeyEvent (disp, modcode, True, 0);
}
//模拟A键按下
XTestFakeKeyEvent (disp, keycode, True, 0);
XTestFakeKeyEvent (disp, keycode, False, 0);
//释放Ctrl键
if (ctrl_value != 0)
XTestFakeKeyEvent (disp, modcode, False, 0);
XSync (disp, False);
XTestGrabControl (disp, False);
XCloseDisplay(disp);
}
Xtst中常用的物理按键的值列表如下:
#define XK_Shift_L 0xffe1 //左Shift
#define XK_Shift_R 0xffe2 //右Shift
#define XK_Control_L 0xffe3 //左Ctrl
#define XK_Control_R 0xffe4 //右Ctrl
#define XK_Caps_Lock 0xffe5 //CapsLock
#define XK_Shift_Lock 0xffe6 //ShiftLock
#define XK_Alt_L 0xffe9 //左Alt
#define XK_Alt_R 0xffea //右Alt
#define XK_Meta_L 0xffe7 //左Windows键
#define XK_Meta_R 0xffe8 //右windows键
#define XK_BackSpace 0xff08 //backspace键
#define XK_Tab 0xff09 //tab键
#define XK_Return 0xff0d //回车换行
#define XK_Escape 0xff1b //ESC键
#define XK_space 0x0020 //空格键
#define XK_plus 0x002b //加
#define XK_minus 0x002d //减
#define XK_multiply 0x00d7 //乘
#define XK_A 0x0041
#define XK_B 0x0042
#define XK_C 0x0043
#define XK_D 0x0044
#define XK_E 0x0045
#define XK_F 0x0046
#define XK_G 0x0047
#define XK_H 0x0048
#define XK_I 0x0049
#define XK_J 0x004a
#define XK_K 0x004b
#define XK_L 0x004c
#define XK_M 0x004d
#define XK_N 0x004e
#define XK_O 0x004f
#define XK_P 0x0050
#define XK_Q 0x0051
#define XK_R 0x0052
#define XK_S 0x0053
#define XK_T 0x0054
#define XK_U 0x0055
#define XK_V 0x0056
#define XK_W 0x0057
#define XK_X 0x0058
#define XK_Y 0x0059
#define XK_Z 0x005a
#define XK_0 0x0030
#define XK_1 0x0031
#define XK_2 0x0032
#define XK_3 0x0033
#define XK_4 0x0034
#define XK_5 0x0035
#define XK_6 0x0036
#define XK_7 0x0037
#define XK_8 0x0038
#define XK_9 0x0039
#define XK_F1 0xffbe
#define XK_F2 0xffbf
#define XK_F3 0xffc0
#define XK_F4 0xffc1
#define XK_F5 0xffc2
#define XK_F6 0xffc3
#define XK_F7 0xffc4
#define XK_F8 0xffc5
#define XK_F9 0xffc6
#define XK_F10 0xffc7
#define XK_F11 0xffc8
#define XK_F12 0xffc9
//更多按键参考keysymdef.h文件
Linux下模拟鼠标移动和点击操作文章来源:https://www.toymoban.com/news/detail-499070.html
//模拟将鼠标移动到x,y位置
void simulate_mouse_move(int x,int y)
{
Display* disp = XOpenDisplay(NULL);
if(disp == NULL)
{
return;
}
XTestGrabControl(disp, True);
XTestFakeMotionEvent(disp, 0, x, y, CurrentTime);
XTestGrabControl(disp, False);
XFlush(disp);
XCloseDisplay(disp);
}
//模拟将鼠标移动到x,y位置然后点击鼠标按键
void simulate_mouse_move_and_click(int x,int y)
{
Display* disp = XOpenDisplay(NULL);
if(disp == NULL)
{
return;
}
XTestGrabControl(disp, True);
//鼠标移动
XTestFakeMotionEvent(disp, 0, x, y, CurrentTime);
//鼠标模拟按键
//@1:屏幕的指针
//@2:按键类型:1(鼠标左键) 3(鼠标右键) 2(鼠标中键)
//4(滚轮正方向滚动) 5(滚轮反方向滚动)
//@3操作的标志位:true(按键按下) false(按键抬起)
//@4操作延时,设置成0就行
XTestFakeButtonEvent(disp, 1, true, CurrentTime);
XTestGrabControl(disp, False);
XFlush(disp);
XCloseDisplay(disp);
}
通过采用Xtst库我们就可以实现各种鼠标键盘操作的模拟了。通过物理操作的模拟可以实现远控和自动化测试等之前无法实现的功能了。文章来源地址https://www.toymoban.com/news/detail-499070.html
到了这里,关于Windows/Linux模拟键盘鼠标操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!