프로그래밍 방식으로 정보를 읽고 감지하거나 얻을 수 있는 방법이 있습니까?실제 물리적 상태수정자 키,루트 수준 액세스가 필요하지 않습니다.오른쪽?
X11, XCB 및 XKB를 사용해 보았지만 해당 이벤트 기반 방법은 수정자 키가 물리적으로 해제되거나 다른 방식으로 사용된 후에만 수정자 키 변경 사항을 등록합니다(예: 마우스 클릭 중).
SHIFT다음 "소비" 이벤트가 발생할 때까지 기다리지 않고도 키 누름/해제 상태 등을 비동기적으로 읽을 수 있는 방법을 찾고 있습니다 . X11/XCB/XKB가 이를 허용하지 않으면 HID 방향으로 가는 것도 고려하겠지만 그렇게 하기 전에 비차단 수정자 이벤트 패턴과 같은 간단한 것을 간과하고 있지 않은지 또는 그런 것 그냥 켜기만 하면 돼요.
수정(2023-09-30):
이제 v2와 원시 키 입력 지원도 살펴봤지만 XInput
별로 도움이 되지 않았습니다. 이벤트 처리는 분명히 드라이버 수준에서 이 동작을 상속받았습니다.
다음 단계는 이 이론을 확인하는 것으로 보이는 조사 결과입니다 evtest
. 드라이버 계층이 관련 상태 변경을 동기적으로 처리/통신하지 않으면 물리적 상태를 비동기적으로 보는 것조차 불가능합니다.
다음은 수정자 누르기/놓기의 간격이 몇 밀리초에 불과한 것을 볼 수 있는 터미널 출력의 복사본입니다. 실제로는 그보다 훨씬 오랫동안 누르는 경우가 있습니다.
Testing ... (interrupt to exit)
Event: time 1696090563.122466, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1c
Event: time 1696090563.122466, type 1 (EV_KEY), code 28 (KEY_ENTER), value 0
Event: time 1696090563.122466, -------------- SYN_REPORT ------------
Event: time 1696090567.475603, type 4 (EV_MSC), code 4 (MSC_SCAN), value 2a
Event: time 1696090567.475603, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 1
Event: time 1696090567.475603, -------------- SYN_REPORT ------------
Event: time 1696090567.487761, type 4 (EV_MSC), code 4 (MSC_SCAN), value 2a
Event: time 1696090567.487761, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 0
Event: time 1696090567.487761, -------------- SYN_REPORT ------------
Event: time 1696090570.051134, type 4 (EV_MSC), code 4 (MSC_SCAN), value 2a
Event: time 1696090570.051134, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 1
Event: time 1696090570.051134, -------------- SYN_REPORT ------------
Event: time 1696090570.062911, type 4 (EV_MSC), code 4 (MSC_SCAN), value 2a
Event: time 1696090570.062911, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 0
Event: time 1696090570.062911, -------------- SYN_REPORT ------------
Event: time 1696090574.108130, type 4 (EV_MSC), code 4 (MSC_SCAN), value 2a
Event: time 1696090574.108130, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 1
Event: time 1696090574.108130, -------------- SYN_REPORT ------------
Event: time 1696090574.119016, type 4 (EV_MSC), code 4 (MSC_SCAN), value 2a
Event: time 1696090574.119016, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 0
Event: time 1696090574.119016, -------------- SYN_REPORT ------------
Event: time 1696090576.276169, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1d
Event: time 1696090576.276169, type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 1
Event: time 1696090576.276169, -------------- SYN_REPORT ------------
Event: time 1696090576.288810, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1d
Event: time 1696090576.288810, type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 0
Event: time 1696090576.288810, -------------- SYN_REPORT ------------
Event: time 1696090577.396269, type 4 (EV_MSC), code 4 (MSC_SCAN), value 38
Event: time 1696090577.396269, type 1 (EV_KEY), code 56 (KEY_LEFTALT), value 1
Event: time 1696090577.396269, -------------- SYN_REPORT ------------
Event: time 1696090577.407817, type 4 (EV_MSC), code 4 (MSC_SCAN), value 38
Event: time 1696090577.407817, type 1 (EV_KEY), code 56 (KEY_LEFTALT), value 0
Event: time 1696090577.407817, -------------- SYN_REPORT ------------