最近看了些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实现虚拟鼠标相关推荐

  1. linux虚拟鼠标驱动,虚拟键盘、虚拟鼠标驱动

    2009-1-22 02:22 找了这篇文,看对你有没有帮助,另外请联系我QQ634308587 一起研究一下. 一个鼠标驱动程序的分析(/driver/input/mouse/amimouse.c) ...

  2. 电视端虚拟鼠标的设计

    最近项目需要在电视端虚拟一个鼠标,所以利用jni来做一个. 下面是虚拟鼠标控制的java代码 SimMouse.java /**  * native tool for browser  */ publ ...

  3. linux平台实现USB虚拟总线驱动一(原理以及开发流程)

    by fanxiushu 2019-11-07 转载或引用请注明原始作者. 之前的文章阐述过在windows平台下,如何实现USB虚拟总线驱动, 以及如何在windows平台采集真实USB设备的数据, ...

  4. Linux web 网站服务器 虚拟主机

    Linux  web 网站服务器  虚拟主机 转载于:https://blog.51cto.com/daijiehao/1861625

  5. Linux之网络管理(2)虚拟网卡

    Linux之网络管理(2)虚拟网卡 在linux中,默认的内核模块中包含了很多与网络相关的组件和工具,来提供对网络的管理和设置.同样,linux中也是支持虚拟网卡的设置,已经多网卡绑定等功能.在网卡不 ...

  6. linux系统中apache虚拟目录配置

    在搭建网站的时候,我们会经常在同一台服务器上面搭建多个站点,这时候就需要用到apache的虚拟机知识.下面就linux系统下apache虚拟目录的配置说简要说明: 1.源代码安装apache + PH ...

  7. [开源] C语言项目实战 - 虚拟鼠标 - VirtualMouse

    C语言项目实战 - 虚拟鼠标 - VirtualMouse 目录 关于软件 软件介绍 使用帮助 项目介绍 源码及软件下载 知识点扫描 热键的使用 鼠标事件的模拟 字体的选用 开机自启动的设置 为软件添 ...

  8. Linux系统篇-文件系统虚拟文件系统

    看了之前的关于Linux内存管理和进程调度的文章,相比读者们应该对Linux有了大致的了解,本文的主题是Linux虚拟文件系统.闲话少说,开始! 1.软链接和硬链接的区别 我们知道文件都有文件名与数据 ...

  9. 理解 neutron(15):Neutron Linux Bridge + VLAN/VXLAN 虚拟网络

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

最新文章

  1. php编程题试题和答案,比较基础的php面试题及答案-编程题部分
  2. bzoj3211,bzoj3038
  3. 剑指Offer_29_最小的K个数
  4. Spring Security基于角色的权限管理
  5. 7.1使用Request获取HTTP请求头
  6. 声明式编程与函数式编程_实用程序类与函数式编程无关
  7. Python较为经典的53个Python库
  8. Ranger-Yarn插件安装
  9. sqlerror.java.1055,请问大佬,eclipse连接数据库出现这个错误怎么办
  10. 王彪20162321 2016-2017-2 《程序设计与数据结构》第6周学习总结
  11. Elipse-基本使用
  12. 顶级公司程序员,一天只写100行代码?
  13. bongo cat mver手机版|键盘猫手机版
  14. pandas绘图线条颜色大全
  15. 前端小程序,h5,浏览器,app, doc,.docx,.ofd,.PDF,.WPS以及Office文档的在线解析预览方式
  16. 5G NR OFDM链路层仿真及Matlab代码实现(1):LDPC信道编译码之5G Tollbox中相关函数使用介绍
  17. 湖南中职计算机考试练习题
  18. Linux学习笔记Day01-01在虚拟机中下载Linux系统(centos)详细步骤,vmtools安装
  19. 【U8】禁止UU(UTU)随登陆账套启动(U8V11.0及其以上版本)
  20. java spark 二进制_spark数据源操作

热门文章

  1. 手把手教你在阿里云服务器上安装Java环境(图文教程)
  2. chrome浏览器避免因flash过期而强制更新
  3. [php-代码审计]百家cms4.14
  4. 如何通过ua区分QQ内置浏览器与QQ浏览器
  5. zynq开发中的设备树
  6. 详细分析contrex-A9的汇编代码__switch_to(进程切换)
  7. 算法设计与分析复习--回溯法
  8. 获取buff市场的价格
  9. 贵卅大学计算机研究生院导师,贵州大学机械工程学院研究生导师:罗绍华
  10. JavaWeb项目----实现用户登录、注册、对商品信息进行的添加、删除、修改功能