在开发一些类似于向日葵或者VNC的远程桌面或者远控软件的时候,我们往往需要模拟键盘操作模拟鼠标操作。通过模拟操作,我们可以在不安装硬件外设的时候实现对电脑的控制。这里介绍一下在Windows和Linux平台下模拟鼠标键盘的实现方式,希望对有相关开发需求的人有帮助。

Windows模拟鼠标键盘操作

在windows下我们可以通过调用对应的windowsAPI实现对应的键盘鼠标操作模拟

模拟键盘操作

组合键的发送方式

#include <Windows.h>
//模拟键盘发送Ctrl+V贴操作
void SendCtrlV()
{// Create a generic keyboard event structureINPUT ip;ip.type = INPUT_KEYBOARD;ip.ki.wScan = 0;ip.ki.time = 0;ip.ki.dwExtraInfo = 0;// Press the "Ctrl" keyip.ki.wVk = VK_CONTROL;ip.ki.dwFlags = 0; // 0 for key pressSendInput(1, &ip, sizeof(INPUT));// Press the "V" keyip.ki.wVk = 'V';ip.ki.dwFlags = 0; // 0 for key pressSendInput(1, &ip, sizeof(INPUT));// Release the "V" keyip.ki.wVk = 'V';ip.ki.dwFlags = KEYEVENTF_KEYUP;SendInput(1, &ip, sizeof(INPUT));// Release the "Ctrl" keyip.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 structureINPUT ip;ip.type = INPUT_KEYBOARD;ip.ki.wScan = 0;ip.ki.time = 0;ip.ki.dwExtraInfo = 0;// Press the "V" keyip.ki.wVk = 'V';ip.ki.dwFlags = 0; // 0 for key pressSendInput(1, &ip, sizeof(INPUT));// Release the "V" keyip.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下模拟鼠标移动和点击操作

//模拟将鼠标移动到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库我们就可以实现各种鼠标键盘操作的模拟了。通过物理操作的模拟可以实现远控和自动化测试等之前无法实现的功能了。

Windows/Linux模拟键盘鼠标操作相关推荐

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

    原理:调用Windows API 头文件: Windows.h 鼠标 参考:MSDN :mouse_event function 按键 使用定义在Winuser.h中的mouse_event函数(Wi ...

  2. Python 模拟键盘鼠标操作实战教程

    在某些情况下,如果我们需要进行自动化操作的应用没有提供相应的接口,我们无法直接通过Python来调用API实现自动化.这种情况下,Python也不是完全没有办法的,我们可以采用模拟键盘和鼠标的方式实现 ...

  3. 程序模拟键盘鼠标操作

    用代码模拟键盘鼠标操作,主要用到keybd_event/mouse_event或者SendInput  API函数.使用示例如下(附注释):         /*         * 模拟键盘输入,以 ...

  4. java 模拟鼠标_java实现简单的模拟键盘鼠标操作

    简简单单的记录: 近期需要用到模拟键盘鼠标操作,所以记录下来,以备后用,看了很多例子,未标明引用,请见谅 package com.text.jna; import javax.imageio.Imag ...

  5. Cypress之模拟键盘鼠标操作以及页面元素拖动操作

    上篇文章讲解了使用cypress框架时,如何上传或者下载文件,以及定位操作iframe和shadow dom下的页面元素.此次课程将讲解如何模拟键盘输入.鼠标操作以及如何拖动页面元素,另外,会介绍如何 ...

  6. python在程序中模拟键盘鼠标操作

    Python中模拟键盘和鼠标最著名的模块是:pymouse 和 pykeyboard.一次安装两个模块比较麻烦,而有一个库整合了这两个模块,而且能支持跨平台操作,这个库叫 PyUserInput,通过 ...

  7. python模拟键盘鼠标操作

    python版本:3.6.2 扩展: autopy3 (python2.x的话 安装autopy 就可以了) //autopy是一个自动化操作的python库,可以模拟一些鼠标.键盘事件,还能对屏幕进 ...

  8. C# 使用Win32 API模拟键盘鼠标操作网页

    在webbrowser控件中的document complete 事件中设置链接到自身 private void ieFrame_DocumentCompleted(object sender, We ...

  9. java整理软件---java模拟键盘,鼠标操作

    1.Java 模拟键盘输入的小Demo,实现自动按下:模拟Ctrl+Alt+Z的按下和抬起    如果你开着qq的话,那么qq会自动弹出来.哈哈,代替人工操作; import java.awt.Rob ...

  10. [转载]C#模拟键盘鼠标事件-SendKeys

    C#模拟键盘鼠标事件-SendKeys 2007-09-18 15:138596人阅读评论(1)收藏举报 1.模拟键盘事件 System.Windows.Forms.SendKeys以下是   Sen ...

最新文章

  1. 华为服务器系统激活id怎么更改,服务器id怎么设置
  2. 是否可以从一个static方法内部发出对非static方法的调用?
  3. linux获取最高权限并取消_通过安卓渗透WIN7获取系统最高权限
  4. JZOJ 100043. 【NOIP2017提高A组模拟7.13】第K小数
  5. 天鼎:一个技术人在世界读书日的遐想
  6. spring mvc 自定义编辑器
  7. 办公技巧分享:如何编辑PDF文件内容
  8. 计算机录入技术五笔输入法教案,五笔打字教案
  9. 网络掘金者信息采集软件行业应用
  10. 王献之碧玉小楷《洛神赋十三行》王献之小楷高清原石拓本对比图
  11. 公路路基路面回弹弯沉检测技术(转载)
  12. MySQL错误ERROR 1045 (28000): Access denied for user 'root'@'localhos
  13. 分享一个CCLE细胞系数据(CCLE数据库不能用了吗?)
  14. vue + vuex 实现评论和回复
  15. 音频单通道转双通道算法
  16. cat命令 – 在终端设备上显示文件内容
  17. 【FPGA-DSP】第九期:音频信号处理
  18. CSS基础之textstyle
  19. 汉诺塔(一) nyist88
  20. 计算机一级内容包括哪些,计算机一级靠哪些内容?

热门文章

  1. 网站整站下载工具—HTTrack Website Copier
  2. 数学建模系列(三)-评价模型(六)---神经网络评价
  3. Inno Setup 6.0.0+ 繁体中文语言包
  4. csgo自建局域网服务器,csgo怎么创建局域网游戏
  5. sd u盘 速度测试软件,u盘速度测试(FlashBench)sd卡速度测试
  6. 博弈论数据可用性声明_手机数据恢复,低调使用~
  7. 易语言删除c盘源码,易语言基础教程利用API删除自身及子文件
  8. 小说自动采集+【深度seo优化】+自适应=小说网站源码
  9. python写入excel数据教程_python实现数据写入excel表格
  10. 快40岁了,我还要不要继续写代码呢?