当前位置: 首页 > news >正文

libuiohook 全局键盘鼠标钩子 C 库入门指南

libuiohook 全局键盘鼠标钩子 C 库入门指南

【免费下载链接】libuiohookA multi-platform C library to provide global keyboard and mouse hooks from userland.项目地址: https://gitcode.com/gh_mirrors/li/libuiohook

libuiohook 让你不装内核驱动、仅靠用户态程序,就能截获整个系统里发生的按键与鼠标动作,同时覆盖 Linux、Windows、macOS 三端。想开发自动化、宏命令或输入监控工具的人,读这篇文章就能把库编译出来并看懂事件是怎么流到你手里的。

先动手:构建时要装哪些依赖

结论先行:只要 CMake 3.10 以上加任意 C99 编译器,代码本身没有第三方运行时库。真正麻烦的是 Linux——它通过 X11 的 XRecord 扩展抓事件,所以要装libx11-devlibxtst-devlibxinerama-dev等一整套 X 开发包;macOS 和 Windows 则直接用系统自带的框架,无需额外安装。

CMakeLists.txt 开头的平台判断决定了源码从哪个目录编译:Windows 走src/windows/,macOS 走src/darwin/,其余一律按src/x11/处理。拿到源码后一条标准流程即可出库:

git clone https://gitcode.com/gh_mirrors/li/libuiohook cd libuiohook mkdir build && cd build # 打开 BUILD_DEMO 会顺带编译 4 个示例程序,产物装进 ../dist cmake -S .. -DBUILD_SHARED_LIBS=ON -DBUILD_DEMO=ON -DCMAKE_INSTALL_PREFIX=../dist cmake --build . --target install

装完库之后,别的项目可以用 CMake 找包或 pkg-config(uiohook.pc会一起生成)来链接它,这就是 pc/uiohook.pc.in 存在的意义。

从哪个文件读起:X11 钩子的事件链条

想看懂核心逻辑,直接读 Linux 版的 src/x11/input_hook.c,整条链路只有三个角色:

  • hook_run():分配一块状态区(修饰键掩码、鼠标连击计数等),然后调xrecord_start()进入 XRecord 监听循环并阻塞,直到钩子被移除才返回。
  • hook_event_proc():X server 每推来一条原始记录,就在这个回调里把它翻译成统一的uiohook_event结构,再交给dispatch_event()转发给你注册的函数。
  • hook_stop():校验并关闭 XRecord 上下文,使hook_run()解除阻塞、释放资源。

hook_run()的骨架如下,注释已按阅读顺序重写:

int hook_run() { hook = malloc(sizeof(hook_info)); // 给本次钩子开一个状态容器 // 修饰键掩码、鼠标按键与连击时间全部清零 hook->input.mask = 0x0000; int status = xrecord_start(); // 启动 XRecord 循环并阻塞,等待 hook_stop free(hook); // 钩子结束后清掉状态区 return status; // 0x00 成功,其余为平台相关错误码 }

你注册的回调不是直接收到 X11 原始事件,而是经过dispatch_event()这层统一后的结构体,字段含义在唯一的公共头文件 include/uiohook.h 里查得到——uiohook_event用 union 装下键盘、鼠标、滚轮三类数据,VC_ESCAPEMASK_CTRL_L这些虚拟键码与修饰掩码也都在这里定义。

改功能时该翻哪条路径

遇到问题前,用这张表先定位,比翻全目录快得多:

路径作用
include/uiohook.h唯一对外头文件:事件结构体、虚拟键码、hook_run/hook_stop声明
src/x11/input_hook.cLinux 实现核心:XRecord 抓事件并翻译成统一事件
src/x11/post_event.c反向注入:通过 XTest 把虚拟按键/鼠标事件送回系统
src/logger.c内部日志的开关与回调桥接,hook_set_logger_proc落在这里
demo/demo_hook.c最短可用范例:注册回调后逐条打印事件,按 Esc 退出
test/uiohook_test.cminunit 测试入口,加-DENABLE_TEST=ON后随主库一起编译

Windows 与 macOS 目录下有同名的四件套(input_hook.cpost_event.c等),结构一一对应,读熟 x11 版本后切换平台只需要看系统 API 的差异部分。man/目录里的手册页则解释了各hook_get_*系统属性函数,用到时再查即可。

接下来做什么

这篇导读把"编译 → 事件流转 → 路径定位"串完了。下一步建议开两个终端验证:一个用-DENABLE_TEST=ON重新构建并跑测试,一个直接运行demo_hook,边敲键盘边看它打印的事件流——你会发现 Esc 触发hook_stop()的那一段正好对应前面讲的链路。若想深入平台细节,src/x11/input_helper.c里的按键码翻译表是下一个值得细读的地方。

【免费下载链接】libuiohookA multi-platform C library to provide global keyboard and mouse hooks from userland.项目地址: https://gitcode.com/gh_mirrors/li/libuiohook

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

http://www.cnnetsun.cn/news/4196970.html

相关文章:

  • GoldenDict-ng:免费词典查询工具,从装好到查出第一个词的 3 分钟攻略
  • [SQL]数据库设计手记:从范式到窗口函数,一个开发者的实战笔记
  • 番茄小说下载器 fanqienovel-downloader 完整指南:输入一个 id,整本书存成离线电子书
  • ESP32局域网实时音频流硬件链路搭建与四大经典坑位解析
  • [C++]《C++ 开发避坑指南:从基础类型到高级构造的常见问题与解决方案》
  • 零成本AI建站:用Kimi K3+Vercel快速生成部署个人网页
  • 大模型后训练护栏如何塑造统一文风并使其文本可被检测
  • VLA模型本地部署实战:从环境搭建到项目包装的完整指南
  • CTIFoundry:索引时构建结构,如何提升智能体F1分数与RAG效果
  • 深入解析TCP状态机:从协议原理到Linux内核实现与故障排查
  • 2026优质SEOGEO服务商精选:7家全栈机构测评+企业选型避坑全攻略
  • 【单片机毕业设计推荐】基于 STM32 的多模式智能门禁锁系统设计与实现 基于 STM32 的指纹刷卡密码门禁及阿里云远程控制系统设计(012507)
  • p和np问题
  • 去除马赛克视频播放器+视频教程
  • 带货视频生成工具全流程项目复盘
  • Linux下Nvidia显卡风扇控制:从底层原理到systemd服务实战
  • ncmdump 拖拽即转:NCM 无损变 MP3,整专辑 3 分钟批量搞定,告别在线转换
  • 华为OD机试:数列计算与斐波那契优化实战
  • QModMaster:ModBus 调试工具使用指南
  • DFT硅后诊断与良率提升技术
  • 用Jellyfin搭家庭照片服务器:3步建好私有云相册
  • 【计算机毕业设计单片机案例】集成 JQ8400 语音播报的病床无线呼叫硬件系统设计 基于 STM32/51 单片机的医患双向呼叫信号采集系统设计(020204)
  • 在树莓派上配置yolo
  • AI应用开发中的敏感信息泄漏:日志为何把手机号原样写进去
  • LLM-Cookbook 学习——搭建基于 ChatGPT 的问答系统>第十章 评估(下)——当不存在一个简单的正确答案时
  • 通俗搞懂 K8s CRD 和 CR:是什么、有什么用、怎么用
  • AI编程术语大全(二):Vibe Coding -AI 编程核心术语与实战指南
  • C语言问题之指针和数组定义和使用
  • 三维扫描一键变 CAD:Scan2CAD 把家具模型自动摆进真实房间
  • 软件测试面试核心考察维度与高频技术问题解析