다른 키보드와 입력을 구별하는 방법은 무엇입니까? 용으로 특별히 설계된

기본 키보드 및 응용 프로그램 용으로 특별히 설계된 키보드와 함께 사용할 수있는 Python으로 응용 프로그램을 작성하고 싶습니다. 스티커가 달린 작은 숫자 키보드를 사용하여 다른 키에 동작을 부여하여 간단히 디자인 할 것입니다. 두 키보드 모두 USB로 연결됩니다.

그러나이 키를 누르면 일반 신호 (숫자, 연산자 및 입력) 만 Python으로 전송되며 기본 키보드와 특수 키보드의 신호를 구별 할 수 없습니다.

파이썬은이 구별을 할 수있는 방법이 없기 때문에 OS 자체에서하고 싶습니다. Raspberry Pi 용으로 프로그래밍 할 예정이므로 Linux가됩니다.

따라서 주요 질문 : 특정 키보드의 키를 다른 키 코드로 다시 매핑하는 방법은 무엇입니까? 다른 용도로는 사용하지 않는 F 키를 사용하는 것에 대해 생각했습니다. 또는 키보드에없는 일부 문자 (있는 경우).

Linux / Unix에서 가능합니까? 그렇다면 어떻게해야합니까?



답변

Linux를 사용하는 경우 입력 장치를 구별하는 가장 좋은 방법은 Linux Event Interface 를 사용하는 것 입니다. 장치의 하드웨어 특정 입력이 디코딩 된 후에는 중간 Linux 특정 이벤트 구조로 변환되고 아래에있는 하나 이상의 문자 장치를 읽어서 사용할 수 있습니다 /dev/input/. 그건 그렇고, 이것은 사용하는 프로그래밍 언어와 완전히 독립적입니다.

각 하드웨어 장치에는 고유 한 /dev/input/eventX장치가 있으며 집계도 있습니다 (예 : /dev/input/mice시스템에있는 모든 마우스의 움직임을 나타냄). 시스템은 또한있을 수 있습니다 /dev/input/by-path/dev/input/by-id.

장치의 이름을 사람이 읽을 수있는 문자열로 반환 하는 ioctl호출 EVIOCGNAME이 있습니다 /dev/input/by-id/usb-Logitech_USB_Gaming_Mouse-mouse. 또는 같은 것을 사용할 수 있습니다 .

장치를 열고 입력 하드웨어에서 이벤트가 도착할 때마다 데이터 패킷을받습니다. C를 읽을 수 있다면, /usr/include/linux/input.h이 것들이 어떻게 작동하는지 정확하게 보여주는 파일 을 연구 할 수 있습니다 . 그렇지 않은 경우 필요한 모든 정보를 제공하는 이 질문읽을 수 있습니다.

이벤트 인터페이스의 좋은 점은 필요한 장치를 찾고 다른 입력 장치를 모두 무시하고 해당 입력 장치 에서만 입력을 읽을 수 있다는 것입니다. 또한 터미널에서 ‘요리 된’문자 스트림을 읽는 것만으로는 일반적으로하지 않는 키, 버튼 및 컨트롤에 대한 알림을받습니다 Shift.

나쁜 점은 이벤트 인터페이스가 ‘요리 된’문자를 반환하지 않고 키의 숫자 코드 만 사용한다는 것입니다 (각 키에 해당하는 코드는 앞에서 언급 한 헤더 파일뿐만 아니라 Python.event.py 소스에서도 찾을 수 있습니다). 입력 장치에 비정상적인 키 / 버튼이있는 경우 올바른 숫자를 얻을 때까지 조금 실험해야 할 수도 있습니다.


답변

다른 접근 방식 ( “키보드”에 키가 많지 않은 경우-대부분의 장치가 키보드 인 경우) 각 키보드에 키 매핑을 적용하고 키가 구별되도록하는 것입니다.

/superuser/760602/how-to-remap-keys-under-linux-for-a-specific-keyboard-only 여기에 요약되어 있습니다 . 요점은 setxkbmap장치 인수를 취하는 것입니다.

원시 입력 방법을 사용하는 경우 lsinput은 원시 장치를 찾습니다.