我正在尝试在 C/C++ 程序中捕获键盘输入,而不需要 root 权限,也不使用 X11 XNextEvent()
。
我尝试直接打开设备,但出于明显的安全原因,直接访问硬件需要 root 权限。我尝试打开的设备/dev/input/by-id/(my keyboard name here)
映射到事件管道 ( /dev/input/event<#>
),需要 root 权限才能读取。
X11 库允许我捕获键盘事件(使用XNextEvent
),但是当客户端想要无头运行且没有 GUI 时,我不能依赖安装了 X11 的客户端。
我需要能够捕获所有键盘键,包括shift、alt、ctrl和super(Windows 或 Mac)键。最好,我还想捕获媒体键,例如播放、音量调高/调低等,并且仅在应用程序具有焦点时捕获。
有人知道我该怎样做吗?
我曾想过只为输入做两个不同的代码路径,一个用于无头,其中它们仅使用 stdin 来提取事件(但据我所知这不会捕获 Shift 键),另一个路径使用 X11,但如果可能的话,我只想维护一个键盘输入系统。
答案1
我能找到的最佳解决方案是创建一个单独的守护进程,作为服务运行,监视/dev/input/..
事件并让其他用户工具连接到自身并监听输入事件。
考虑一些可以替代 XEvent 的东西。(将这些输入事件带入用户空间)