所以,我一直在尝试在Linux中访问键盘输入.具体来说,我需要能够访问修改键按下而不按下其他键.此外,我希望能够在没有运行X系统的情况下执行此操作.
所以,简而言之,我的要求是:
0 = not pressed,1 = currently pressed让我知道在检查键盘时是否按下了键我正常的Linux机器在我的新公寓的卡车上; 所以,我现在只有Macbook Air可以使用.因此,我在VM中运行Linux来测试它.
VirtualBox中的虚拟机
以下所有内容都是在这种环境下完成的.我已经尝试过使用X运行和其他一个ttys.
如果有人可以纠正我,我会改变这个.
我已经做了一些阅读,意识到更高级别的库不提供这种功能.修饰符键与其他键一起使用以提供备用键代码.通过Linux中的高级库访问修饰键本身并不容易.或者说,我还没有在Linux上找到高级API.
我认为libtermkey就是答案,但它似乎不支持Shift修饰键,比普通键击检索更好.我也不确定它是否可以在没有X的情况下工作.
在使用libtermkey时(在我意识到它没有像Shift-Return这样的情况下发生转变之前),我正计划编写一个可以运行以收集键盘事件的守护进程.运行守护程序的副本只会管理键盘数据请求并接收键盘数据作为响应.我可以使用此设置在后台运行某些内容,以防我无法在特定时间检查密钥代码状态(必须在发生时接收密钥代码).
下面是我尝试编写一个可以从Linux键盘设备读取的程序.我还包括我的小支票,以确保我有合适的设备.
我试图直接访问键盘设备,但遇到了问题.我在这里尝试了另一个Stack Overflow线程中的建议.它给了我一个分段错误; 所以,我把它从fopen改为open:
// ...
int fd;
fd = open("/dev/input/by-path/platform-i8042-serio-0-event-kbd", O_RDONLY);
char key_map[KEY_MAX/8 + 1];
memset(key_map, 0, sizeof(key_map));
ioctl(fd, EVIOCGKEY(sizeof key_map), key_map);
// ...
Run Code Online (Sandbox Code Playgroud)
虽然没有分段错误,但没有任何按键的指示(不仅仅是修改键).我测试了这个:
./foo && echo "TRUE" …Run Code Online (Sandbox Code Playgroud) 我有一个RFID USB设备注册为HID设备(或多或少的USB键盘).
我正在寻找一种捕获此输入的方法,并在它到达普通键盘事件处理程序之前阻塞/过滤它(并将10位RFID代码输出到控制台).
我当然必须专门捕获这个设备,并留下真正的键盘输入(或传递它).
我最初的想法是在UDEV中阻止设备(所以usbhid/event/kbd内核模块没有绑定它)并为这个设备编写我自己的基本驱动程序 - 但我不知道从哪里开始,或者如果那样甚至会工作.
什么是伟大的(我不确定是否可以这样做) - 如果我编写一个事件过滤器模块,可以与事件驱动程序保持一致并捕获(然后过滤)来自RFID单元,但让其他一切都通过.我想这样一个模块不需要太多代码,而且最实用.
救命?
[编辑:我应该补充说没有安装Xorg - 仅限控制台]
cat /proc/bus/input:
I: Bus=0003 Vendor=0419 Product=0912 Version=0100
N: Name="NewRoad Sem. NewRoad System PS2 Interface"
P: Phys=usb-0000:00:1d.3-2/input0
S: Sysfs=/devices/pci0000:00/0000:00:1d.3/usb5/5-2/5-2:1.0/input/input20
U: Uniq=
H: Handlers=sysrq kbd mouse0 event3
B: PROP=0
B: EV=120017
B: KEY=70000 0 0 e080ffdf01cfffff fffffffffffffffe
B: REL=103
B: MSC=10
B: LED=1f
Run Code Online (Sandbox Code Playgroud)
更多信息:
lsusb -d 0419:0912 -v
Bus 005 Device 019: ID 0419:0912 Samsung Info. Systems America, Inc.
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.00
bDeviceClass …Run Code Online (Sandbox Code Playgroud)