我编写了一个从usb第二个键盘(实际上是条形码扫描仪)获取输入的程序。问题是如果另一个窗口处于活动状态,则在那里输入数据而不是在我的程序中。有人可以就我做错了什么给我建议吗?
#include <stdio.h>
#include <string.h>
int main(int argc, char * argv[]){
FILE * fp_in;
char * data;
fp_in = fopen("/dev/input/by-id/usb-04d9_1400-event-kbd","r");
if(fp_in == NULL){
fprintf(stderr,"Failed to open input by id\n");
}
fp_in = fopen("/dev/input/by-path/pci-0000:00:1d.1-usb-0:2:1.0-event-kbd","r");
if(fp_in == NULL){
fprintf(stderr,"Failed to open input by path\n");
return 1;
}
while(1){
fscanf(fp_in,data,"%s");
fprintf(stderr,"%s",data);
}
return 0;
}
感谢
<小时/> 如果我可以大胆地代表Confuzzled重新解释这个问题:
如何在Linux下编写一个附加到输入设备的程序,在这种情况下是一个条形码扫描器,这样输入就不会转到具有键盘焦点的程序?
答案 0 :(得分:4)
我试图做同样的事情,我做的是使用xinput“浮动”该设备。就我而言,xinput list
显示(除其他外)
HID Keyboard Device HID Keyboard Device id=13 [slave keyboard (3)]
这是与条形码扫描仪对应的设备。然后,您只需输入
即可 xinput float 13
进入终端。来自扫描仪的击键将不再进入聚焦窗口,但仍可从设备文件中读取它们。但是,您需要解码从文件中读取的事件以获取所需的信息(条形码)。有关如何执行此操作的一些信息,请参阅format of /dev/input/event*?。
最后,要读取没有root权限的设备文件,只需为扫描程序添加udev规则。对我来说,它是这样的:
SUBSYSTEM=="input", ATTRS{idVendor}=="1d57", ATTRS{idProduct}=="001c" MODE="0644"
通过在插入扫描仪后检查dmesg
的输出,可以找到扫描仪的idVendor和idProduct。
答案 1 :(得分:2)
自问这个问题以来已经有一段时间了:)无论如何,我认为你应该做的是使用linux输入设备子系统API。
http://www.linuxjournal.com/article/6429这是一个很好的介绍。
答案 2 :(得分:1)
我将开始列出与您的任务有关的常见问题列表,我没有答案,但我至少可以提供一些关于为什么您遇到问题的信息。
出于明显的安全原因,键盘设备对它们具有访问控制限制。出于显而易见的原因,如果任意应用程序在未经正确许可的情况下嗅探/挂钩键盘,则可能会产生致命的后果,AKA:键盘记录器。
有时,当一个应用程序(在您的情况下为X)已获得对输入设备的控制时,它会占用发送给它的所有字节。因此,如果您设法绕过权限问题,您仍然会遇到一个问题,即其他一些软件正在消耗数据流。
答案 3 :(得分:1)
如果我正确理解了您的问题,可能会出现与您想要做的事情相对应的一些问题。
1)为了从/ dev文件夹中读取这些文件,您需要拥有root权限。
2)(我对此不太确定)但我相信这些是特殊文件,因此您无法像普通文件那样阅读它们。
假设您处理了这两个问题,它仍然无法解决您的问题,因为X事件由X服务器处理,您可以将其视为同时读取同一文件。它是捕获这些事件并通过为最顶层活动窗口中的特定事件调用相关事件处理程序(如果有)来相应地处理它们的事件。所有的窗口都与X服务器通信,告诉它是否输入了某些内容。因此,即使您打开了一个程序正在运行的终端窗口,首先X服务器必须告诉窗口按键,然后将按键传递给终端中运行的程序。
可以找到执行类似工作的另一个代码here。