Linux

如何防止鍵盤被目前應用程序解釋?

  • June 17, 2017

我有 3 個 USB 鍵盤連接到 Linux。通常,當在任何一個上寫字時,字元“去”到目前活動的應用程序,例如終端或任何其他應用程序。

/dev/input/eventX但是,我通過使用一些perl 模組讀取特定設備直接從兩個鍵盤讀取鍵盤事件。當腳本正確讀取和解碼所有事件時,輸入的鍵也將進入活動應用程序。

**問題是:是否可以停止將鍵盤事件從特定鍵盤路由到活動應用程序?**例如,在某種程度上告訴核心來自特定鍵盤的輸入不應該被視為正常的鍵盤輸入。

編輯

因為X11從每個具有設備節點的設備中讀取/dev/input/event*- kooks 之類的,這裡有 2 種可能的解決方案:

  1. 將 USB“鍵盤”的名稱稍微更改為另一個名稱eventN,而不是/dev/input/myinput0. 不幸的是,udev規則不允許重命名設備。(該NAME指令rules.d僅適用於網路設備,其他設備只能創建符號連結)
  2. 稍微更改X11配置,/usr/share/X11/xorg.conf.d/10-evdev.conf忽略某些特定的“類似鍵盤”的設備 - 例如不要讀取每個eventN設備。目前在我的系統中,它包含:
Section "InputClass"
       Identifier "evdev keyboard catchall"
       MatchIsKeyboard "on"
       MatchDevicePath "/dev/input/event*"
       Driver "evdev"
EndSection

任何想法如何做上述任何一項?


真實背景:我已經連接了兩個 USB-RFID 閱讀器。它們充當鍵盤,例如,當我用 RFID 標籤觸摸閱讀器時,它會發送與在鍵盤上鍵入的完全相同的 RFID 編號 - 例如,閱讀器充當普通鍵盤。我的應用程序可以讀取 RFID 事件(在後台),並且(當然)我不想將 RFID 中的字元獲取到活動視窗中。

如果您正在閱讀/dev/input/eventX,只需對其執行EVIOCGRABioctl 即可。您可以輕鬆地在Perl中發出 ioctl 。當您的程序退出時,不要忘記釋放抓取。

抓取將阻止所有其他設備,包括 X,從該設備讀取事件。

這比 更乾淨xinput,因為您還排除了可能想要直接從設備讀取的其他應用程序,並且您還可以控制排除的持續時間(只要您的應用程序執行)。

xinput您可以使用該命令禁用 X 下的輸入設備。執行xinput list以列出可用設備,然後xinput disable …按名稱或編號禁用設備。

Udev 可能是要走的路,但 X11 是我想不到的。

引用自:https://unix.stackexchange.com/questions/371466