현재 애플리케이션에서 키보드가 해석되는 것을 방지하는 방법은 무엇입니까?

현재 애플리케이션에서 키보드가 해석되는 것을 방지하는 방법은 무엇입니까?

Linux에 3개의 USB 키보드가 연결되어 있습니다. 일반적으로 둘 중 하나에 쓸 때 문자는 터미널이나 다른 응용 프로그램과 같은 현재 활성화된 응용 프로그램으로 "이동"합니다.

/dev/input/eventX그러나 다음을 사용하여 특정 장치를 읽어 두 키보드에서 직접 키보드 이벤트를 읽고 있습니다.펄 모듈. 스크립트가 모든 이벤트를 올바르게 읽고 디코딩하면 입력한 키도 활성 애플리케이션으로 이동합니다.

문제는 키보드 이벤트가 특정 키보드에서 활성 애플리케이션으로 라우팅되는 것을 중지할 수 있는가입니다. 예를 들어, 특정 키보드의 입력을 일반 키보드 입력으로 처리해서는 안 된다는 점을 커널에 알리는 것입니다.

장치 노드가 있는 모든 장치에서 데이터를 읽으 므로 두 가지 가능한 솔루션이 있는 X11것으로 보입니다 ./dev/input/event*

  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의 문자를 활성 창에 넣고 싶지 않습니다.

답변1

어쨌든 읽고 있다면 ioctl을 /dev/input/eventX사용하십시오 EVIOCGRAB. 다음에서 ioctl을 발행할 수 있습니다.진주용이하게. 프로그램이 종료되면 잡기를 해제하는 것을 잊지 마십시오.

가져오면 다른 모든 장치(X 포함)가 이 장치에서 이벤트를 읽지 못하게 됩니다.

기기에서 직접 읽으려는 다른 앱도 제외하고 제외 기간을 제어할 수도 있기 때문에 이보다 더 깔끔합니다 xinput(앱이 실행되는 동안).

답변2

xinput다음 명령을 사용하여 X에서 입력 장치를 비활성화 할 수 있습니다 . 실행 xinput list하여 사용 가능한 장치를 나열한 다음 xinput disable …이름이나 번호로 장치를 비활성화합니다.

Udev가 좋은 방법일 수도 있지만, 제가 즉시 아는 것은 X11입니다.

관련 정보