我已经写了一个程序,从第二个键盘(实际上是一个条形码扫描仪)获取input。 问题是,如果另一个窗口是活动的数据input在那里,而不是在我的程序。 有人可以给我build议我做错了什么?
#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下编写一个程序,将其自身附加到一个input设备,在这种情况下是一个条形码扫描器,以便input不会进入具有键盘焦点的程序?
我试图做同样的事情,我所做的就是使用xinput“浮动”该设备。 在我的情况下, xinput list
显示(除其他外)
HID Keyboard Device HID Keyboard Device id=13 [slave keyboard (3)]
这是与条形码扫描仪相对应的设备。 你可以简单地输入
xinput float 13
进入终端。 从扫描仪的击键将不再进入聚焦的窗口,但仍然可以从设备文件中读取。 但是,您需要解码从文件中读取的事件以获取所需的信息(条形码)。 请参阅/ dev / input / event *的格式 了解如何做到这一点的信息。
最后,要读取没有root权限的设备文件,只需为扫描器添加一个udev规则即可。 对我来说,就是这样的:
SUBSYSTEM=="input", ATTRS{idVendor}=="1d57", ATTRS{idProduct}=="001c" MODE="0644"
插入扫描仪后,可以通过检查dmesg
的输出来找到扫描仪的idVendor和idProduct。
这个问题已经有一段时间了:)无论如何,我认为你应该做的就是使用linux输入设备子系统API。
我将开始列出一些关于你的任务的常见问题,我没有答案,但是我至少可以提供一些关于你有什么问题的信息。
键盘设备,出于安全原因,有访问控制限制他们。 出于显而易见的原因,如果任意的应用程序可以在没有正确的许可的情况下嗅探/钩住键盘,则可能具有致命的后果,即键盘记录器。
有时候,当一个应用程序(在你的情况下,X)已经获得了对输入设备的控制权之后,它消耗了发送给它的所有字节。 所以,如果你设法解决了权限问题,那么你还有一个问题,就是其他一些软件在使用数据流。
如果我已经正确地理解了你的问题,可能会有一些问题对应你想要做的事情。
1)为了从/ dev文件夹中读取这些文件,你需要拥有root权限。
2)(我不太确定这一点),但我相信这些是特殊的文件,因此你不能像读普通文件那样阅读它们。
假设你处理了这两个问题,它仍然不能解决你的问题,因为X事件是由X服务器处理的,你可以把它看成是同时读取同一个文件。 它是通过调用相关事件处理程序(如果有的话)来捕获这些事件并相应地处理它们,以便在最上面的活动窗口中查找特定事件。 所有的窗口都与X服务器通信,告知是否输入了某些内容。 所以,即使在运行程序的时候打开终端窗口,首先X服务器必须告诉窗口有关按键的信息,然后将这些按键传递给终端中运行的程序。
另一个类似的代码可以在这里找到。