news 2026/5/8 10:30:08

ydotool开发指南:理解uinput框架与虚拟设备创建原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ydotool开发指南:理解uinput框架与虚拟设备创建原理

ydotool开发指南:理解uinput框架与虚拟设备创建原理

【免费下载链接】ydotoolGeneric command-line automation tool项目地址: https://gitcode.com/gh_mirrors/yd/ydotool

一、什么是uinput框架?

uinput是Linux内核提供的一个强大框架,允许用户空间程序创建和模拟输入设备。通过uinput,开发者可以编写程序来模拟键盘、鼠标、触摸屏幕等输入设备的行为,这为自动化测试、远程控制和辅助技术等场景提供了可能。

在ydotool项目中,uinput框架被广泛应用于创建虚拟输入设备,从而实现各种输入操作的模拟。

二、虚拟设备创建的基本流程

创建虚拟输入设备通常需要以下几个关键步骤:

2.1 打开uinput设备

首先,需要打开/dev/uinput设备文件,这是与uinput框架交互的入口点。在ydotool的实现中,可以在Daemon/ydotoold.c文件中找到相关代码:

int fd_ui = open("/dev/uinput", O_WRONLY); if (fd_ui < 0) { perror("failed to open uinput device"); exit(1); }

2.2 配置设备功能

接下来,需要配置虚拟设备支持的输入事件类型。这包括键盘按键(EV_KEY)、相对坐标(EV_REL)和绝对坐标(EV_ABS)等。在ydotool中,这一过程由uinput_setup函数处理:

static void uinput_setup(int fd, enum ydotool_uinput_setup_options setup_opt) { if (setup_opt & ENABLE_KEY) { if (ioctl(fd, UI_SET_EVBIT, EV_KEY)) { fprintf(stderr, "UI_SET_EVBIT %s failed\n", "EV_KEY"); } // 设置支持的按键列表 // ... } if (setup_opt & ENABLE_REL) { if (ioctl(fd, UI_SET_EVBIT, EV_REL)) { fprintf(stderr, "UI_SET_EVBIT %s failed\n", "EV_REL"); } // 设置支持的相对坐标轴 // ... } if (setup_opt & ENABLE_ABS) { if (ioctl(fd, UI_SET_EVBIT, EV_ABS)) { fprintf(stderr, "UI_SET_EVBIT %s failed\n", "EV_ABS"); } // 设置支持的绝对坐标轴 // ... } // ... }

2.3 设置设备信息

然后,需要设置虚拟设备的基本信息,如名称、总线类型、厂商ID和产品ID等:

static const struct uinput_setup usetup = { .name = "ydotoold virtual device", .id = { .bustype = BUS_VIRTUAL, .vendor = 0x2333, .product = 0x6666, .version = 1 } }; if (ioctl(fd, UI_DEV_SETUP, &usetup)) { perror("UI_DEV_SETUP ioctl failed"); exit(2); }

2.4 创建设备

最后,通过UI_DEV_CREATEioctl命令完成虚拟设备的创建:

if (ioctl(fd, UI_DEV_CREATE)) { perror("UI_DEV_CREATE ioctl failed"); exit(2); }

三、ydotool中的uinput应用

ydotool项目充分利用uinput框架实现了多种输入模拟功能。以下是一些关键应用场景:

3.1 键盘事件模拟

在Client/tool_type.c中,通过uinput_emit函数模拟键盘按键事件:

uinput_emit(EV_KEY, KEY_LEFTSHIFT, 1, 1); // 按下Shift键 uinput_emit(EV_KEY, kc, 1, 1); // 按下字符键 uinput_emit(EV_KEY, kc, 0, 1); // 释放字符键 uinput_emit(EV_KEY, KEY_LEFTSHIFT, 0, 1); // 释放Shift键

3.2 鼠标事件模拟

在Client/tool_click.c中,模拟鼠标点击事件:

uinput_emit(EV_KEY, keycode, 1, 1); // 按下鼠标键 uinput_emit(EV_KEY, keycode, 0, 1); // 释放鼠标键

在Client/tool_mousemove.c中,模拟鼠标移动:

uinput_emit(EV_REL, REL_X, pos[0], 0); // X轴相对移动 uinput_emit(EV_REL, REL_Y, pos[1], 1); // Y轴相对移动

四、uinput事件发送机制

在ydotool中,uinput_emit函数是发送输入事件的核心函数,定义在Client/ydotool.c中:

void uinput_emit(uint16_t type, uint16_t code, int32_t val, bool syn_report) { struct input_event ev = { .type = type, .code = code, .value = val, }; gettimeofday(&ev.time, NULL); write(sock, &ev, sizeof(ev)); if (syn_report) { struct input_event ev_syn = { .type = EV_SYN, .code = SYN_REPORT, .value = 0, }; gettimeofday(&ev_syn.time, NULL); write(sock, &ev_syn, sizeof(ev_syn)); } }

这个函数负责构造输入事件结构,并通过socket发送到ydotoold守护进程。每个事件都包含类型、代码和值三个要素,最后通过发送EV_SYN类型的同步事件来通知内核处理已发送的事件。

五、编译和使用ydotool

要编译ydotool项目,首先需要克隆仓库:

git clone https://gitcode.com/gh_mirrors/yd/ydotool cd ydotool

然后使用CMake进行构建:

mkdir build cd build cmake .. make

编译完成后,可以使用以下命令启动ydotoold守护进程:

sudo ./ydotoold

之后就可以使用ydotool客户端工具来模拟各种输入操作了。

六、总结

uinput框架为Linux系统提供了强大的虚拟输入设备支持,而ydotool项目则充分利用这一框架实现了灵活的命令行输入自动化工具。通过理解uinput的工作原理和ydotool的实现方式,开发者可以更好地掌握虚拟输入设备的创建和使用方法,为自动化测试、远程控制等场景开发出更加强大的工具。

无论是模拟键盘输入、鼠标操作还是触摸屏幕事件,uinput都提供了统一的接口,使得这些操作的实现变得简单而高效。ydotool作为一个优秀的开源项目,为我们展示了如何充分利用uinput框架来构建实用的工具。

【免费下载链接】ydotoolGeneric command-line automation tool项目地址: https://gitcode.com/gh_mirrors/yd/ydotool

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 10:29:40

Unity点云可视化终极指南:Pcx插件实现高效三维数据渲染

Unity点云可视化终极指南&#xff1a;Pcx插件实现高效三维数据渲染 【免费下载链接】Pcx Point cloud importer & renderer for Unity 项目地址: https://gitcode.com/gh_mirrors/pc/Pcx 在Unity中处理点云数据一直是3D开发者的技术痛点&#xff0c;但Pcx插件彻底改…

作者头像 李华
网站建设 2026/5/8 10:28:00

华硕笔记本性能降温利器:G-Helper降压调校实战指南

华硕笔记本性能降温利器&#xff1a;G-Helper降压调校实战指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Exper…

作者头像 李华
网站建设 2026/5/8 10:27:05

抖音下载器使用指南:3步轻松保存喜欢的视频和直播

抖音下载器使用指南&#xff1a;3步轻松保存喜欢的视频和直播 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. …

作者头像 李华
网站建设 2026/5/8 10:25:56

机器视觉(MV)与机器人视觉(RV)的本质区别(3)

重磅预告&#xff1a;本专栏将独家连载新书《AI视觉技术&#xff1a;从入门到进阶》精华内容。本书是《AI视觉技术&#xff1a;从进阶到专家》的权威前导篇&#xff0c;特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“AI教…

作者头像 李华
网站建设 2026/5/8 10:20:29

开源智能仪表盘OpenJarvisDashboard:从模块化设计到实战部署全解析

1. 项目概述&#xff1a;一个开源智能仪表盘的诞生最近在GitHub上看到一个挺有意思的项目&#xff0c;名字叫“OpenJarvisDashboard”。光看这个标题&#xff0c;你可能会联想到钢铁侠里的那个智能管家Jarvis&#xff0c;没错&#xff0c;这个项目的核心目标就是打造一个开源的…

作者头像 李华