android使用uinput节点任意注入鼠标事件-重学安卓input子系统

android uinput模拟输入设备事件 文章目录嵌入式开发基础使用文件执行注意事项Android 多点触摸协议(Multi-touch Protocol)补充知识-NDK-BUILD补充知识-CMake 嵌入式开发基础 使用文件 MainActivity.kt//执行activity native-lib.cpp //JNI 文件 tool_lib.cpp //C++工具类 CMakeLists.txt //配置文件 执行注意事项 首先/dev/uinput开发需要获取系统权限: manifests 文件中在添加android:shar 阅读详情

背景:

前面文章已经对aosp自带的uinput命令进行了如何使用的实战,具体看下面文章:
手把手教你uinput命令的使用方式-重学安卓input子系统
但是明显只使用命令还是有以下问题,命令注入事件性能不够块,注入的事件需要提前准备好,相当于只能实现录制事件,然后播放录制事件这种,所以基于这个背景那就需要有一个非常灵活的方式通过uinput来实现对事件的自由控制,那么需要使用代码来实现对/dev/uinput节点直接进行相关的事件写入,这样事件发什么都是由代码自由控制,灵活性大大提高。

下面就用代码实现注入鼠标设备,而且鼠标可以在拨号盘上面进行点击的功能
在这里插入图片描述

实战代码如下:

核心c文件如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/input.h>
#include <linux/uinput.h>
#include <time.h>

#define die(str, args...) do { \
        perror(str); \
        exit(EXIT_FAILURE); \
} while(0)

int main(void)
{
    int                    fd;
    struct uinput_user_dev uidev;
    struct input_event     ev;
    int                    dx = 0, dy = 0;
    int                    i;

     fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
if(fd < 0) die("error: open");

    //config uinput working mode,  mouse or touchscreen?  relative coordinates or absolute coordinate?
    if(ioctl(fd, UI_SET_EVBIT, EV_KEY) < 0)         //support key button
        die("error: ioctl");
    if(ioctl(fd, UI_SET_KEYBIT, BTN_LEFT) < 0)  //support mouse left key
        die("error: ioctl");

    if(ioctl(fd, UI_SET_KEYBIT, BTN_RIGHT) < 0)  //support mouse right key
        die("error: ioctl");

    if(ioctl(fd, UI_SET_EVBIT, EV_REL) < 0)       //uinput use relative coordinates
        die("error: ioctl");
    if(ioctl(fd, UI_SET_RELBIT, REL_X) < 0)         //uinput use x coordinates
        die("error: ioctl");
    if(ioctl(fd, UI_SET_RELBIT, REL_Y) < 0)         //uinput use y coordinates
        die("error: ioctl");

    memset(&uidev, 0, sizeof(uidev));                  //creat an virtul input device node in /dev/input/***
    snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-sample");
    uidev.id.bustype = BUS_USB;
    uidev.id.vendor  = 0x1;
    uidev.id.product = 0x1;
    uidev.id.version = 1;

    if(write(fd, &uidev, sizeof(uidev)) < 0)
        die("error: write");

    if(ioctl(fd, UI_DEV_CREATE) < 0)
        die("error: ioctl");

    sleep(2);
    srand(time(NULL));

while(1) {
	if (dx == 80) {
	    dx = -80;
	}
        //模拟鼠标移动
        for(i = 0; i < 20; i++) {
            //send input event to kernel input system
            memset(&ev, 0, sizeof(struct input_event));
            ev.type = EV_REL;         //send x coordinates
            ev.code = REL_X;
            ev.value = dx = dx +1;
            if(write(fd, &ev, sizeof(struct input_event)) < 0)
                die("error: write");

            memset(&ev, 0, sizeof(struct input_event));
            ev.type = EV_REL;  //send y coordinates
            ev.code = REL_Y;
            ev.value = dy;
            if(write(fd, &ev, sizeof(struct input_event)) < 0)
                die("error: write");
            usleep(15000);
            dy = 0;
        }

		

        //模拟鼠标左键点击
        //mouse click left key begin
	    memset(&ev, 0, sizeof(struct input_event));
	    ev.type = EV_KEY;  //mouse left key
	    ev.code = BTN_LEFT;
	    ev.value = 1;
	    if(write(fd, &ev, sizeof(struct input_event)) < 0)
		die("error: write");

	    memset(&ev, 0, sizeof(struct input_event));
	    ev.type = EV_SYN; // inform input system to process this input event
	    ev.code = 0;
	    ev.value = 0;
	    if(write(fd, &ev, sizeof(struct input_event)) < 0)
		die("error: write");
        		
	    memset(&ev, 0, sizeof(struct input_event));
	    ev.type = EV_KEY;  //mouse left key
	    ev.code = BTN_LEFT;
	    ev.value = 0;
	    if(write(fd, &ev, sizeof(struct input_event)) < 0)
		die("error: write");

	    memset(&ev, 0, sizeof(struct input_event));
	    ev.type = EV_SYN; // inform input system to process this input event
	    ev.code = 0;
	    ev.value = 0;
	    if(write(fd, &ev, sizeof(struct input_event)) < 0)
		die("error: write");
        	sleep(1);
        //mouse click left key end

    }

    sleep(2);

    if(ioctl(fd, UI_DEV_DESTROY) < 0)
        die("error: ioctl");
    close(fd);
    return 0;
}

对应的Android.mk文件

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
    uinput.c

LOCAL_MODULE := uinput_test

include $(BUILD_EXECUTABLE)

编译push:

mmm demo_uinput/
adb push out/target/product/emu64x/system/bin/uinput_test /data/local/tmp/

实战成果如下:
在这里插入图片描述
同时使用getevent命令也可以获取到相关的输出:

adb shell getevent -lrt

add device 15: /dev/input/event14
  name:     "uinput-sample"
[  151687.511482] /dev/input/event14: EV_REL       REL_X                00000001            
[  151687.511482] /dev/input/event14: EV_SYN       SYN_REPORT           00000000             rate 0
[  151687.526731] /dev/input/event14: EV_KEY       BTN_MOUSE            DOWN                
[  151687.526731] /dev/input/event14: EV_SYN       SYN_REPORT           00000000             rate 65
[  151687.526770] /dev/input/event14: EV_KEY       BTN_MOUSE            UP                  
[  151687.526770] /dev/input/event14: EV_SYN       SYN_REPORT           00000000             rate 25641
[  151688.526906] /dev/input/event14: EV_REL       REL_X                00000002            
[  151688.526906] /dev/input/event14: EV_SYN       SYN_REPORT           00000000             rate 0
[  151688.542255] /dev/input/event14: EV_KEY       BTN_MOUSE            DOWN                
[  151688.542255] /dev/input/event14: EV_SYN       SYN_REPORT           00000000             rate 65
[  151688.542324] /dev/input/event14: EV_KEY       BTN_MOUSE            UP                  
[  151688.542324] /dev/input/event14: EV_SYN       SYN_REPORT           00000000             rate 14492

更多framework实战干货,请关注下面“千里马学框架”

uinput Linux的uinput机制允许用户空间程序创建虚拟输入设备,模拟键盘、鼠标等物理设备的输入行为。通过/dev/uinput接口,程序可以设置设备属性、发送输入事件并同步到内核。典型应用包括自动化测试、游戏控制、远程桌面等场景。使用时需加载uinput模块、处理权限问题,并注意同步事件通知内核。该机制通过input_event结构传递事件,最终由内核处理为真实输入,为系统级输入仿真提供了灵活的用户态解决方案。 阅读详情

相关推荐

android 使用uinput模拟输入设备的方法

主要介绍了android 使用uinput模拟输入设备的方法,有需要的朋友可以参考一下

uinput模块分析 -- 1 初识uinput

kernel/Documentation/input/uinput.rst uinput是一个内核模块,可以从用户空间模拟输入设备。 通过写入 /dev/uinput(或 /dev/input/uinput)设备,进程可以创建具有特定功能的虚拟输入设备。 一旦创建了该虚拟设备,该进程便可以通过它发送事件,这些事件将传递给用户空间和内核用户。 ...

ldl617的专栏 5147

Cadence数模混合仿真实战:从Verilog到ADE L的完整流程解析

本文详细解析了Cadence数模混合仿真的完整流程,从Verilog代码编写到ADE L仿真环境配置。通过实战案例讲解如何创建Config文件、搭建混合信号原理图,并分享提高仿真效率的技巧和常见问题排查方法,帮助工程师掌握这一关键芯片设计验证技术。

weixin_29246195的博客 986

Linux input子系统(二)uinput 原理和用途

uinput即,uinput 的实现是基于 Linux input子系统(Input Subsystem),允许用户空间程序创建虚拟的输入设备并向内核发送输入事件,比如键盘敲击、鼠标移动等,就像这些事件来自真实的物理设备一样。对于开发自定义输入设备驱动、自动化测试、游戏控制模拟以及各种人机交互实验等场景非常有用。

2067

小白的MatSWMM使用心路(二)——用matlab修改INP文件参数/使用matlab查找txt内容并修改多行内容

说是修改inp,但是里面的内容大部分还是讲怎么修改txt的……(?)。包含如何找到需要的参数(关键字)位置,以及修改那个位置的txt这样的内容。希望能帮助大家吧……Matlab你要多出好用的功能啊!

weixin_44276743的博客 4530

如何在huggingface上申请下载使用llama2/3模型

huggingface-cli download --resume-download 模型名称 --local-dir 存放模型的位置 --local-dir-use-symlinks False --resume-download --token token序列号xxxxxxx。登录huggingface,在模型详情页面上,找到这个表单,填写内容,提交申请。需要使用梯子,country填写梯子的位置吧(比如美国)等待一小时左右,会有邮件通知。

a61022706的博客 1万+

重学input知识之探索uinput相关内容--学员作业

uinput通过创建一个虚拟的输入设备接口,允许用户在没有物理输入设备的情况下模拟输入操作。它允许开发者在软件层面模拟硬件设备的行为,这对于开发和测试涉及输入设备的软件非常有用。uinput支持多种输入事件,包括键盘按键、鼠标移动和点击等,使得开发者可以方便地测试和调试相关的应用程序。

learnframework的博客 544

AFSIM仿真系统组件开发入门:手把手教你扩展传感器与武器模型

本文为AFSIM仿真系统组件开发入门指南,手把手教你如何扩展传感器与武器模型。通过深入解析AFSIM基于组件的体系结构,并结合构建自定义电子扫描阵列雷达传感器和协同交战智能武器系统两个实战案例,详细介绍了从C++插件开发、MATLAB算法集成到脚本接口暴露的完整流程,帮助你掌握定制AFSIM仿真的核心能力。

t8u9v0w1x的博客 489

Android 使用uInput模拟手柄设备

背景 前文说到需求,需要在系统应用里模拟手柄摇杆和按键。之前已经通过模拟KeyEvent实现按键,模拟MotionEvent实现摇杆大致实现了这个功能,但是遇到新的问题,有些游戏不识别按键,尤其是多人云游戏。 解决方案 大致了解之后, KeyEvent和MotionEvent里有个deviceId字段,这个字段是用来表示不同的设备的。比如多人游戏,a手柄和b手柄的deviceId是不同的,游戏根据这个来区分不同的人做的操作,游戏可能是根据这个deviceId是否存在并且可以匹配,如果不存在则可能不处理这个事

BrainZou的博客 2586

【FPGA教程案例37】通信案例7——基于FPGA的FFT,IFFT傅里叶变换和逆变换

关于FFT和IFFT的相关描述,在上一课程我们已经有所了解,本课程不再重复。在上一课程,我们初步掌握了如何通过FFT对输入信号进行频谱分析,在本课程,我们将学习如何通过FPGA实现FFT和IFFT得到初始信号的过程。关于FFT的IP核配置,和上一课程相同。下面直接介绍其verilog调用过程。我们可以看到,IFFT的配置非常简单,在FFT的基础上,只需要将该参数的最后一位改为0,就可以实现IFFT变化。下面我们通过testbench文件,同时调用FFT和IFFT实现信号的傅里叶变换和逆变换。......

FPGA/MATLAB学习教程/源码/项目合作开发 4517

Android 系统使用uinput模拟鼠标输入设备的方法

接到组长给的新任务,项目需要实现一个通过摄像头获取图像数据,然后通过OpenCV进行手势识别,再将识别到的手势信息转换成鼠标事件信息回传给input子系统,进而实现通过手势模拟鼠标操作来对Android系统进行操作的功能。 这里先对事件注入部分做简要分析介绍。 系统端怎样模拟input event呢,此处我们通过uinput桥接;原理是利用内核现有的uinput驱动,通过内核驱动uinput来...

Android学习之旅 4623

elevation mapping算法3之使用D435i相机离线或在线订阅点云和tf关系生成高程图

本文主要学习使用D435i相机发出的点云作为高程图的点云输入,如何离线输入点云生成高程图,进一步学习如何在线订阅点云生成高程图。

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 3488

android uinput 按键_android 使用uinput模拟输入设备的方法

在google remote中,android接收端接收socket发来的IR CODE,然后将IR CODE模拟出来发给系统处理,这就是google remote接收端的原理。系统端怎样模拟input event呢?方法一:通过Instrumentation.sendKeyDownUpSync 实现,简单使用但是问题在于sendKeyDownUpSync发出的event,无法运行到interce...

weixin_36318506的博客 707

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux uinput

Linux Uinput 是一个模拟用户输入事件的内核驱动程序,它允许用户空间程序通过创建虚拟输入设备节点来生成模拟输入事件,这些事件可以是键盘、鼠标、触摸屏或其他输入设备的事件。此外,Uinput 还可以为虚拟输入设备设置各种属性,并支持对输入事件进行过滤和修改。选项,并使用相关API在用户空间中创建和操作虚拟输入设备。使用 Linux Uinput 驱动程序可以实现一些有趣的功能,例如编写自动化脚本、制作键盘快捷键、游戏控制器和虚拟触摸屏等。驱动程序,需要在内核配置中启用。

小灰灰的博客 1626

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

M平台 按键板/触摸框 虚拟uinput 设备

基于Android平台的TV 产品,输入设备中除了上篇提到的遥控器,空鼠。还有一些模拟 出来的uinput 设备“Mstar Smart TV Keypad” ,“libxTouchScreen” 。 1. 虚拟按键板 上篇我们通过getevent -l 可以看到device 2(/dev/input/event3)是属于按键板的keypad 设备,在Mstar 平台作为一个服务在后台运行 在运...

Tony的专栏 2053

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

10.3 uinput

uinput 是一个内核驱动,应用程序通过它可以在内核中模拟一个输入设备,其设备文件名是 /dev/uinput 或 /dev/input/uinput。

lf282481431的博客 1037

【Android休眠】引申之uinput: 用户空间的输入子系统

uinput is a linux kernel module that allows to handle the input subsystem from user land. It can be used to create and to handle input devices from an application. It creates a character device in /dev/input directory. The device is a virtual interface, it

u013686019的专栏 2383

uinput的使用

Uinput是一个虚拟的设备,使得可以在用户控件处理input设备,一般来讲uinput设备文件存在于/dev/input或者/dev/input/uinput目录中。 uinput的使用 一. 创建合适的uinput设备 1.打开uinput设备 so easy, 在linux中,一切都是文件,所以按照通常的做法就是使用系统调用open()来打开uinput设备就

gjh558的专栏 4521

【RFB】Linux uinput 分析,虚拟鼠标,键盘

Linux 有自己的 input 子系统,可以统一管理鼠标和键盘事件。基于输入子系统 实现的 uinput 可以方便的在用户空间模拟鼠标和键盘事件。当然,也可以自己造轮子, 做一个字符设备接收用户输入,根据输入,投递 input 事件。还有一种方式就是直接 往 evnent 里写入数据, 都可以达到控制鼠标键盘的功能。本篇文章就是演示直接写入 event 的方法。linux/input.h中有定义...

java开发指南博客 【转载】 518

android uinput 按键_使用UInput模拟系统键盘鼠标动作

1. 打开UInput Device:应用程序:dev 为 UInput Node名:通常为/dev/uinput。open(dev, O_WRONLY | O_NDELAY);此时,在Kernel 层,对应的动作为:static int uinput_open(struct inode *inode, struct file *file)参数inode对应的是 主设备为10,子设备为223的no...

weixin_34738099的博客 843

uinput模拟触摸屏双指放大与缩小

uinput模拟触摸屏双指放大与缩小前言创建虚拟设备并配置属性写入单个事件创建事件序列程序运行过程后记 前言 有时为了获取某种事件,需要使用uinput来创建一个虚拟的设备,通过先配置好设备属性,将预定好的input event序列写入/dev/uinput设备文件,便可在没有硬件设备的情况下获得所需设备的某个事件。 本文主要以分析代码的方式讲解如何利用uinput模拟触摸屏的双指放大与缩小,涉及...

初夏夕空的博客 4700

uinput 用法 android 上层使用uinput 的用法来模拟 input 事件

android 上层使用uinput 的用法来模拟 input 事件

PCWUNG的专栏 2552
上一篇: 手把手教你uinput命令的使用方式-重学安卓input子系统
下一篇: audio系统开发之核心属性等介绍
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值