linux系统下,在用户空间应用程序中模拟发送系统键盘事件 您所在的位置:网站首页 枣庄学院内网密码 linux系统下,在用户空间应用程序中模拟发送系统键盘事件

linux系统下,在用户空间应用程序中模拟发送系统键盘事件

2024-06-01 08:19| 来源: 网络整理| 查看: 265

Linux 有自己的 input 子系统,可以统一管理鼠标和键盘事件。

如果想模拟键盘事件,但是系统没有键盘设备该如何是好?

基于输入子系统实现的 input 可以方便的在用户空间模拟鼠标和键盘事件。

也可以自己做一个字符设备接收用户输入,根据输入,投递 input 事件。

还有一种方式就是直接往evnent 里写入数据, 都可以达到控制鼠标键盘的功能。---没有键盘设备的话,向哪一个event里面写?

好文:

http://blog.chinaunix.net/uid-23381466-id-3883164.html

https://blog.csdn.net/neiloid/article/details/7893732

相关书籍:

https://blog.csdn.net/huaweimember/article/details/51001672

http://baijiahao.baidu.com/s?id=1601404998850288910&wfr=spider&for=pc

weekend 探索成功, 使用uinput驱动来实现 linux系统用户空间模拟按键事件:

    这几篇真是太棒了!:

    http://sipgreen.iteye.com/blog/1774676

    http://sipgreen.iteye.com/blog/1774676

    http://blog.sina.com.cn/s/blog_602f87700100llew.html

    https://www.cnblogs.com/myblesh/articles/2367648.html

    https://www.cnblogs.com/myblesh/articles/2367648.html

   https://www.kernel.org/doc/html/v4.12/input/uinput.html ----linux官网上关于uinput模块的介绍

  首先在内核中添加uinput模块(也可以将这个模块直接编译进内核里面),然后使用wriet系统函数向文件中写入键盘事件!

linux2.6.x内核提供了uinput驱动,它可以帮助用户将数据(包括用户输入的键盘或者鼠标或者触摸板数据)注入到Linux内核,这对于编写用户自定义的输入设备的应用程序是非常有用。

驱动程序使用/dev/uinput的设备,将数据发送到内核空间,内核将数据发送到X-Windows或者shell终端。此功能可用于所有涉及图形用户的输入。

uinput驱动在许多linux内核里均被配置为可加载的模块,你可以通过$ modprobe uinput 命令加载luinput驱动。

$ lsmod 命令列出linux系统已经加载的所有驱动。你应该可以看到“uinput”驱动也在这个列表中。但是如果你是在kernel里把uinput设置成编译进内核,而不是编译成模块的话,那么你通过lsmod是看不到uinput模块的。但你在/dev下会看到uinput的设备结点。后面你可以直接打开此结点来向uinput发送数据。

相关头文件:

#include   #include   #include   #include   #include   #include   #include   #include  

step1:打开uinput设备并设置设备参数:

uinp_fd = open(“/dev/uinput”,O_WRONLY|O_NDELAY);

If(uinp_fd < 0){

    printf(“unable to open /dev/uinput\n”);//也有可能在/dev/input/uniput

    Return -1;

}

成功打开/dev/uinput设备之后,需要通过驱动的ioctl函数(点击打开链接)来配置uinput设备的参数,包括鼠标参数、键盘参数等,即设置Input Device关心或者说会产生的消息:

ioctl(uinp_fd ,UI_SET_EVBIT,EV_KEY); //设置设备所支持的动作,#defineEV_KEY 0x01 // 按下键

ioctl(uinp_fd ,UI_SET_EVBIT,EV_REP); //设置设备所支持的动作,#defineEV_KEY 0x02 // 释放

   (//EV_KEY和EV_REP来告诉uinput驱动是包含键值的键盘事件。)

ioctl(uinp_fd , UI_SET_RELBIT, REL_X); //包含鼠标事件

ioctl(uinp_fd , UI_SET_RELBIT, REL_Y);

ioctl(uinp_fd , UI_SET_EVBIT, EV_ABS);

ioctl(uinp_fd , UI_SET_ABSBIT, ABS_X);

ioctl(uinp_fd , UI_SET_ABSBIT, ABS_Y);

ioctl(uinp_fd , UI_SET_ABSBIT, ABS_PRESSURE);

for(i = 0; i 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有