- 发布时间
构建 wshowkeys_rs:用 Rust 重新定义按键显示工具
构建 wshowkeys_rs:用 Rust 重新定义按键显示工具
你有没有看编程教程时,特别想知道演示者到底按了哪些键?又或者你自己也在做内容,想把那些行云流水的快捷键操作直接展示给观众看?那你来对地方了!🚀
来认识一下 wshowkeys_rs——这是一个 快得离谱 的 Rust 实现,它能实时显示你的按键输入,并通过一层漂亮的透明浮窗把它们展示出来。你可以把它理解成“让键盘开口说话”,只不过它不是发出吵人的敲击声,而是用优雅的视觉反馈轻盈地漂浮在应用之上。
这段旅程:从简单点子到打磨完成的工具
构建 wshowkeys_rs 的过程真的像一场冒险!它最初只是一个基于控制台的 MVP,后来逐渐进化成一个 专业级 Wayland 浮层工具,并且还能原生集成 Hyprland。下面就来看看这个小项目是怎么一步步长成现在这个样子的。
Version 1.1.0:朴素但扎实的起点
一切都从最基础的需求开始:捕获按键,并把它显示在终端里。借助 Rust 强大的 evdev 库,我可以直接读取 /dev/input/event* 设备,捕获多把键盘上的每一次按键。是不是已经有点意思了?
整个架构在当时非常直接:输入模块负责抓键,渲染模块负责输出到控制台,应用模块用异步通道把它们协调起来。底子其实已经很稳了,哪怕输出效果看起来还颇有一点早期计算机时代的味道。
Version 1.2.0:拥抱 Wayland,真正变得可视化
这一步开始,事情就 真的变得很有趣了。我放弃了纯控制台方案,转而使用 eframe/egui 构建 GUI 浮层。从这一刻开始,按键不再只是终端里的文本,而是会漂浮在屏幕上的透明按钮。
真正的关键突破,是和 Hyprland 的窗口管理系统做了集成。通过一些精巧的窗口规则,我做出了一个完全无边框、透明、不会抢焦点、也不会打扰工作流的浮层窗口。按键时它出现,3 秒无输入后优雅淡出。
还有一个很重要的细节:系统不再机械地显示单独的修饰键。按下 Ctrl+L 时,界面直接显示 Ctrl+L,而不是把 Ctrl 和 L 拆成两个按钮挤在屏幕上。就是这些看起来很小的打磨,决定了一个工具只是“能用”,还是“真的顺手”。
Version 1.3.0:细节与完成度拉满
最新版本里,wshowkeys_rs 的视觉体验终于真正成型。我花了很多时间去打磨界面:统一的 32x24px 按钮尺寸、经过微调的间距与边距。无论是 F1 到 F12、标点符号、导航键,还是其他特殊按键,都得到了同样精致的处理。
文字渲染也变得自适应了。单字符是一种字号,像 Ctrl+Shift+V 这样的组合键又是另一种字号。听起来很简单,但要把视觉平衡调整到“刚刚好”,其实非常费工夫。
引擎盖下:一个真正顺手的架构
稍微 geek 一下,聊聊它到底是怎么工作的——因为这套架构其实还挺优雅:
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Input Module │───▶│ App Module │───▶│ Render Module │
│ (evdev) │ │ (coordination) │ │ (egui/console) │
└─────────────────┘ └──────────────────┘ └─────────────────┘
Input Module 是整个系统的主力,使用 evdev 同时从多个输入设备捕获原始键盘事件。它会智能跟踪修饰键状态,也能优雅处理设备错误——毕竟,没人希望在拔掉键盘时程序直接崩掉。
App Module 负责协调一切:管理输入和渲染之间的异步通道、处理运行模式切换(GUI 或控制台)、维护应用状态。它像一位真正的指挥家。
最后是 Render Module,它有两种形态——日常使用时的漂亮 GUI 浮层,以及在需要简洁可靠输出时的控制台模式。
这些特性,真的会让人会心一笑
wshowkeys_rs 的特别之处,不只是它能工作,而是它工作得 很好看、很自然。开箱即用时,你能获得这些能力:
实时按键显示:每次按键都会立刻显示,而且会智能处理组合键,再也不用猜快捷键到底有没有生效。
聪明的修饰键处理:系统能理解上下文。按下 Ctrl+Shift+L,你看到的就是完整组合,而不是三个分散的小按钮让人眼花。
透明浮层:窗口完全透明、无边框,像魔法一样悬浮在应用上方。需要时它出现,不需要时它就安静消失。
完整按键支持:从字母、数字,到功能键、标点、方向键,只要你能按出来,wshowkeys_rs 基本都能显示。
多设备支持:有多把键盘?完全没问题。它能同时从多个输入设备捕获事件,适合复杂桌面或外接键盘场景。
自动隐藏逻辑:按键时显示,3 秒后自动淡出。就像一个特别懂分寸的助手,知道什么时候该出现,什么时候该安静。
快速开始:比你想象得更简单
配置 wshowkeys_rs 非常直接。没有复杂安装流程,也没有依赖地狱,只有熟悉的 Rust 简洁感:
cargo build --release
./target/release/wshowkeys_rs
就这样!默认就是浮层模式,直接得到漂亮的透明显示效果。如果你偶尔怀念老派控制台体验,只要加上 --console 参数,就能切回终端输出。
如果你是 Hyprland 用户(说实话,这年头谁不喜欢 Hyprland 呢?),再配上一组窗口规则,浮层的位置和行为就会变得非常舒服。把它们加进配置里,你的按键显示体验就真正进入“极乐模式”了。
最棒的一点是:不需要 sudo! 现代 Linux 系统对普通用户访问输入设备已经友好得多,所以你无需搞什么危险的权限升级,就能正常使用这个工具。
接下来呢?未来真的很值得期待
wshowkeys_rs 的 roadmap 里还有很多有意思的方向。比如可自定义主题和颜色——毕竟,谁不想让按键显示和自己的桌面风格更搭?还会加入更多显示模式和布局,让用户更自由地决定按键如何出现。
配置文件支持也在计划中,这样个性化设置就能跨会话保留下来。还有个很酷的想法:把鼠标点击显示也整合进来,让你不仅能展示键盘操作,还能把那些恰到好处的点击一起演示出来。
录制与回放功能也已经在考虑中。想象一下,你可以保存一段按键会话,然后在教程或演示里回放出来——这真的非常有用。
更技术一点的细节
如果你也是开发者,想看看实现方式,wshowkeys_rs 里其实有不少很有意思的 Rust 模式。项目结构非常清晰:
main.rs负责入口逻辑和参数解析app.rs通过异步通道与错误处理来协调全局input.rs管理多设备 evdev 键盘捕获egui_render.rs构建漂亮的 GUI 浮层render.rs提供控制台回退渲染
基于 tokio 的异步架构保证了输入处理不会阻塞,而超时逻辑也采用了很自然的设计:不是逐个按键超时,而是在最后一次输入后 3 秒统一清空所有键位显示。正是这种“看似细小、实际关键”的设计,让工具用起来特别顺手。
系统在每一层都考虑了错误恢复——无论是设备断开、权限问题还是渲染异常,都能尽量优雅处理。因为你最不想看到的事情,就是在一场重要演示中,按键显示工具突然崩掉。
收尾:为什么 wshowkeys_rs 值得做
在这个很多工具都试图什么都做的世界里,wshowkeys_rs 反而很难得地保持了专注。它只做一件事——显示你的按键——但它把这件事做得 非常出色。不管你是在做教程、调试快捷键绑定,还是单纯想给桌面增加一点视觉表现力,它都能很好地满足需求。
从控制台 MVP 到打磨完成的 Wayland 浮层,这一路真的很有成就感。每个版本都增加了新的能力,同时又保留了最初那种简单、直接、易用的核心体验。再加上 Rust 本身的内存安全与性能优势,这个工具既可靠,也足够高效。
所以下次当你想知道自己刚刚到底按了什么,或者你想把键盘操作优雅地展示给别人看时,不妨试试 wshowkeys_rs。你的按键,值得以这种 透明、漂浮、漂亮 的方式被看见!
欢迎去 GitHub 看看这个项目,让你的手指真正“开口说话”吧!🎹✨