Linux环境下如何用C#实现全局键盘钩子捕获USB遥控器输入
可行实现方案推荐
方案一:基于Libevdev封装实现(最稳定,适配需求)
libevdev是Linux原生的输入设备处理库,专门用于读写/dev/input下的输入设备事件,完美解决你提到的两个核心问题:
- 可以通过
EVIOCGRABioctl实现设备独占访问,拦截后其他程序不会收到该遥控器的输入事件 - 无需root权限,仅需配置udev规则或把当前用户加入
input用户组即可访问
实现步骤
- 安装系统依赖:
sudo apt install libevdev-dev
- 你的C#项目安装NuGet包
LibevdevSharp - 核心代码示例:
using LibevdevSharp; using LibevdevSharp.Events; // 替换为你遥控器的实际VID、PID,可通过lsusb命令查看 const ushort TargetVid = 0xXXXX; const ushort TargetPid = 0xXXXX; // 枚举所有输入设备找到目标遥控器 var devicePath = Directory.EnumerateFiles("/dev/input", "event*") .FirstOrDefault(path => { try { using var dev = new EvdevDevice(path); return dev.IdVendor == TargetVid && dev.IdProduct == TargetPid; } catch { return false; } }); if (devicePath == null) { Console.WriteLine("未找到目标遥控器"); return; } using var remoteDev = new EvdevDevice(devicePath); // 独占设备,其他程序无法接收输入 remoteDev.Grab(); // 监听输入事件 while (true) { var ev = remoteDev.NextEvent(); if (ev.Type == EventType.EV_KEY && ev.Value == 1) { // 按键按下事件 Console.WriteLine($"按下按键:{(Key)ev.Code}"); // 在这里触发你程序的对应逻辑 } }
权限配置(无需root)
如果不想以root身份运行程序,执行以下任意一种配置即可:
- 将当前用户加入input用户组,重启后生效:
sudo usermod -aG input $USER
- 编写专属udev规则,仅开放该遥控器的访问权限:
在/etc/udev/rules.d/99-sg-remote.rules中添加如下内容(替换为实际VID PID):
SUBSYSTEM=="input", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", MODE="0664", GROUP="input"
重载udev规则后重新插入遥控器即可生效:
sudo udevadm control --reload-rules && sudo udevadm trigger
方案二:GUI程序输入源过滤(仅适用带界面的程序)
如果你的程序是GUI应用(基于Avalonia/GTK#/MAUI等框架开发),可以直接在窗口的输入事件回调中判断输入设备来源,仅处理该遥控器的输入并拦截事件冒泡,无需访问底层输入设备,权限要求最低。
方案三:HIDSharp极简实现
如果更倾向用HIDSharp,核心逻辑如下:枚举所有HID设备匹配VID/PID和对应接口,打开设备后异步读HID报告即可,不需要复杂的API调用,几行代码即可实现基础读取逻辑。
内容的提问来源于stack exchange,提问作者GrantByrne
相关产品推荐
相关产品推荐

