Linux使用uinput实现虚拟鼠标
最近看了些linux模拟鼠标按键的方法,但是都要从/proc/bus/input/devices中去查看现有的鼠标设备,然后重用该设备,比较麻烦,而且不是很好——可能对应不同硬件要作一定改动。后来学习发现可以让用户态程序利用uinput的输入子系统来创建一个自己的虚拟设备,然后再向我们的这个虚拟设备写入事件,最后证明也能够实现功能。
我对于Linux算是个入门汉,有些地方理解不够,有什么错误欢迎大家指正。~~
下面是我实现虚拟设备和模拟鼠标移动的代码:
#include <sys/ioctl.h>
#include <linux/uinput.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>#include <errno.h>
#include <stdio.h>
#include <string.h>#define ALOGE(...) \printf(__VA_ARGS__); \printf("\n")#define UINPUT_NAME "/dev/uinput"
#define VIR_MOUSE_NAME "DFC Virtual Mouse"static int device_handler = -1;
static struct uinput_user_dev vir_mouse;static int install_uinput_mouse_device()
{if (device_handler > 0){ALOGE("virtual mouse has been installed already.");return device_handler;}//open uinput deviceif ((device_handler = open(UINPUT_NAME, O_WRONLY | O_NDELAY)) <= 0){ALOGE("open uinput(%s) failed.", UINPUT_NAME);device_handler = -1;return device_handler;}//setup our uinput device of virtual mousememset(&vir_mouse, 0, sizeof(struct uinput_user_dev));strncpy(vir_mouse.name, VIR_MOUSE_NAME, UINPUT_MAX_NAME_SIZE);vir_mouse.id.version = 4;vir_mouse.id.bustype = BUS_USB;//if we don't do these register, it seems like not to workioctl(device_handler, UI_SET_EVBIT, EV_KEY);for (int i = 0; i < 256; i++){ioctl(device_handler, UI_SET_KEYBIT, i);}//setup mouse coordinate eventioctl(device_handler, UI_SET_EVBIT, EV_REL);ioctl(device_handler, UI_SET_RELBIT, REL_X);ioctl(device_handler, UI_SET_RELBIT, REL_Y);//setup mouse button eventioctl(device_handler, UI_SET_KEYBIT, BTN_MOUSE);ioctl(device_handler, UI_SET_KEYBIT, BTN_TOUCH);ioctl(device_handler, UI_SET_KEYBIT, BTN_LEFT);ioctl(device_handler, UI_SET_KEYBIT, BTN_RIGHT);ioctl(device_handler, UI_SET_KEYBIT, BTN_MIDDLE);//create input device into input subsystemwrite(device_handler, &vir_mouse, sizeof(vir_mouse));if (ioctl(device_handler, UI_DEV_CREATE)){ALOGE("install mouse uinput device failed with error(%s).", strerror(errno));close(device_handler);device_handler = -1;}return device_handler;
}static void uninstall_uinput_mouse_device()
{if (device_handler > 0){ioctl(device_handler, UI_DEV_DESTROY);close(device_handler);device_handler = ERROR_DEVICE_HANDLER;}
}void mouse_move(struct data* data)
{if (device_handler <= 0){install_uinput_mouse_device();}if (device_handler > 0){struct input_event event;memset(&event, 0, sizeof(event));//x coordinategettimeofday(&event.time, 0);event.type = EV_REL;event.code = REL_X;event.value = data->x;write(device_handler, &event, sizeof(event));//y coordinateevent.type = EV_REL;event.code = REL_Y;event.value = data->y;write(device_handler, &event, sizeof(event));//execute move eventevent.type = EV_SYN;event.code = SYN_REPORT;event.value = 0;write(device_handler, &event, sizeof(event));}else{ALOGE("invalid device file handler.");}
}
下面的代码是测试鼠标移动的代码:
#include <unistd.h>int main(int argc, char** argv)
{struct data data;data.x = 2;data.y = 2;while (1){mouse_move(&data);sleep(1);}return 0;
}
然后执行:gcc -o uinput-deamo main.c my_virtual_mouse.c
sudo ./uinput-deamo
我们可以看到鼠标会在每秒移动以下鼠标。查看/proc/bus/input/devices可以看到我们添加的设备。
Linux使用uinput实现虚拟鼠标相关推荐
- linux虚拟鼠标驱动,虚拟键盘、虚拟鼠标驱动
2009-1-22 02:22 找了这篇文,看对你有没有帮助,另外请联系我QQ634308587 一起研究一下. 一个鼠标驱动程序的分析(/driver/input/mouse/amimouse.c) ...
- 电视端虚拟鼠标的设计
最近项目需要在电视端虚拟一个鼠标,所以利用jni来做一个. 下面是虚拟鼠标控制的java代码 SimMouse.java /** * native tool for browser */ publ ...
- linux平台实现USB虚拟总线驱动一(原理以及开发流程)
by fanxiushu 2019-11-07 转载或引用请注明原始作者. 之前的文章阐述过在windows平台下,如何实现USB虚拟总线驱动, 以及如何在windows平台采集真实USB设备的数据, ...
- Linux web 网站服务器 虚拟主机
Linux web 网站服务器 虚拟主机 转载于:https://blog.51cto.com/daijiehao/1861625
- Linux之网络管理(2)虚拟网卡
Linux之网络管理(2)虚拟网卡 在linux中,默认的内核模块中包含了很多与网络相关的组件和工具,来提供对网络的管理和设置.同样,linux中也是支持虚拟网卡的设置,已经多网卡绑定等功能.在网卡不 ...
- linux系统中apache虚拟目录配置
在搭建网站的时候,我们会经常在同一台服务器上面搭建多个站点,这时候就需要用到apache的虚拟机知识.下面就linux系统下apache虚拟目录的配置说简要说明: 1.源代码安装apache + PH ...
- [开源] C语言项目实战 - 虚拟鼠标 - VirtualMouse
C语言项目实战 - 虚拟鼠标 - VirtualMouse 目录 关于软件 软件介绍 使用帮助 项目介绍 源码及软件下载 知识点扫描 热键的使用 鼠标事件的模拟 字体的选用 开机自启动的设置 为软件添 ...
- Linux系统篇-文件系统虚拟文件系统
看了之前的关于Linux内存管理和进程调度的文章,相比读者们应该对Linux有了大致的了解,本文的主题是Linux虚拟文件系统.闲话少说,开始! 1.软链接和硬链接的区别 我们知道文件都有文件名与数据 ...
- 理解 neutron(15):Neutron Linux Bridge + VLAN/VXLAN 虚拟网络
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
最新文章
- php编程题试题和答案,比较基础的php面试题及答案-编程题部分
- bzoj3211,bzoj3038
- 剑指Offer_29_最小的K个数
- Spring Security基于角色的权限管理
- 7.1使用Request获取HTTP请求头
- 声明式编程与函数式编程_实用程序类与函数式编程无关
- Python较为经典的53个Python库
- Ranger-Yarn插件安装
- sqlerror.java.1055,请问大佬,eclipse连接数据库出现这个错误怎么办
- 王彪20162321 2016-2017-2 《程序设计与数据结构》第6周学习总结
- Elipse-基本使用
- 顶级公司程序员,一天只写100行代码?
- bongo cat mver手机版|键盘猫手机版
- pandas绘图线条颜色大全
- 前端小程序,h5,浏览器,app, doc,.docx,.ofd,.PDF,.WPS以及Office文档的在线解析预览方式
- 5G NR OFDM链路层仿真及Matlab代码实现(1):LDPC信道编译码之5G Tollbox中相关函数使用介绍
- 湖南中职计算机考试练习题
- Linux学习笔记Day01-01在虚拟机中下载Linux系统(centos)详细步骤,vmtools安装
- 【U8】禁止UU(UTU)随登陆账套启动(U8V11.0及其以上版本)
- java spark 二进制_spark数据源操作
热门文章
- 手把手教你在阿里云服务器上安装Java环境(图文教程)
- chrome浏览器避免因flash过期而强制更新
- [php-代码审计]百家cms4.14
- 如何通过ua区分QQ内置浏览器与QQ浏览器
- zynq开发中的设备树
- 详细分析contrex-A9的汇编代码__switch_to(进程切换)
- 算法设计与分析复习--回溯法
- 获取buff市场的价格
- 贵卅大学计算机研究生院导师,贵州大学机械工程学院研究生导师:罗绍华
- JavaWeb项目----实现用户登录、注册、对商品信息进行的添加、删除、修改功能