【问题标题】:Trapping second keyboard input in (ubuntu) linux在(ubuntu)linux中捕获第二个键盘输入
【发布时间】:2008-11-12 22:59:16
【问题描述】:

我编写了一个程序,该程序从第二个 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 下编写一个附加到输入设备(在本例中为条形码扫描仪)的程序,以便输入不会转到具有键盘焦点的程序?

【问题讨论】:

  • 也许您应该询问一种区分键盘的编程方式?
  • 另外,您使用什么样的设备作为键盘和条形码阅读器(USB、PS/2、串口等)?
  • stackoverflow.com/faq 请在再次询问为什么这不是问题之前阅读它。
  • 为之前措辞不当的问题欢呼抱歉

标签: linux input barcode


【解决方案1】:

我试图做同样的事情,我所做的是使用 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"

您的扫描仪的 idVendor 和 idProduct 可以在插入扫描仪后通过检查 dmesg 的输出找到。

【讨论】:

    【解决方案2】:

    这个问题已经有一段时间没有被问到了:) 无论如何,我认为你应该做的是使用 linux 输入设备子系统 API。

    http://www.linuxjournal.com/article/6429这里有一个很好的介绍。

    【讨论】:

      【解决方案3】:

      我将首先列出与您的任务相关的常见问题,我没有答案,但我至少可以说明为什么您会遇到问题。

      1. 出于明显的安全原因,键盘设备对其具有访问控制限制。出于显而易见的原因,如果任意应用程序可以在未经正确许可的情况下嗅探/挂钩键盘,则可能会产生致命的后果,AKA:键盘记录器。

      2. 有时,当一个应用程序(在您的情况下为 X )获得了输入设备的控制权时,它会吃掉发送给它的所有字节。因此,如果您设法解决了权限问题,您仍然会遇到一些其他软件正在使用您之前的数据流的问题。

      【讨论】:

        【解决方案4】:

        如果我正确理解了您的问题,可能会有一些问题与您想要做的事情相对应。

        1) 要读取 /dev 文件夹中的这些文件,您需要具有 root 权限。

        2)(我不太确定)但我相信这些是特殊文件,因此您无法像阅读普通文件一样阅读它们。

        假设你解决了这两个问题,它仍然不能解决你的问题,因为 X 事件是由 X 服务器处理的,你可以认为它同时读取同一个文件。它是捕获这些事件并通过调用相关事件处理程序(如果有)为最顶部活动窗口中的特定事件相应地处理它们的事件。所有的窗口都与 X 服务器对话,它会告诉您是否输入了某些内容。因此,即使您打开了一个正在运行程序的终端窗口,X 服务器首先必须告诉窗口有关按键的信息,然后将这些按键传递给终端中运行的程序。

        另一个做类似工作的代码可以在here找到。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-01
          • 2012-05-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多