키보드 수정자를 강제로 해제하는 방법


18

때로는 전체 화면 VirtualBox 게스트를 사용할 때 내 컴퓨터간에 시너지 효과를 사용할 때 이상한 키 수정자가 켜져있는 경우가 있습니다. 키보드에 (Shift_L과 같은) 존재하는 경우 키보드를 누르면 상태가 재설정되고 작은 글자를 계속 입력 할 수 있습니다. 그러나 일부는 내 키보드에 전혀 매핑되어 있지 않으므로 (ISO_Level3_Shift와 같이) 전혀 끌 수있는 방법이 없습니다!

재설정하는 방법? 지금 당장 할 수있는 일은 컴퓨터를 재부팅하는 것이지만 오히려 당혹스러운 해결책입니다.

내가 원하는 것은 가능한 모든 키보드 수정자를 인위적으로 "탭"할 수있는 프로그램이므로 상태가 재설정됩니다. 할 수 있습니까?

Mint 14 (Ubuntu 12.10 Quantal의 복제본)를 사용합니다.

답변:


22

xdotool설치 했다면 간단히 사용할 수 있습니다.

xdotool keyup ISO_Level3_Shift

키 릴리스 (물론 ISO_Level3_Shift의 경우) 이벤트를 X 서버로 보냅니다.

그러나 모든 수정 자 키를 해제하는 프로그램이 필요했습니다. xdotool을 사용하여 쉽게 달성 할 수 있습니다. 그렇지 않으면 수정 자 키 심이 정의되어 있는지 전혀 모릅니다. 그것들을 찾는 한 가지 가능한 방법은 파싱하는 것입니다 keysymdef.h.

grep '^#define' /usr/include/X11/keysymdef.h | sed -r 's/^#define XK_(\S*?).*$/\1/;' | grep -E '_(L|R|Level.*)$'

이는 반드시 수정자인 일부 키 심을 리턴합니다. 불행히도 현재 수정 자 키에 대한 정확한 정의를 찾을 수 없으므로 전체 목록인지 알 수 없습니다.

| xargs xdotool keyup위 파이프 라인에 추가 하면 모든 키가 해제됩니다. 내 시스템에서는 다음 명령을 실행합니다.

xdotool keyup Shift_L Shift_R Control_L Control_R Meta_L Meta_R Alt_L Alt_R Super_L Super_R Hyper_L Hyper_R ISO_Level2_Latch ISO_Level3_Shift ISO_Level3_Latch ISO_Level3_Lock ISO_Level5_Shift ISO_Level5_Latch ISO_Level5_Lock

1
큰! 또한 할당되지 않은 키가 키 코드를 통해 풀릴 수 있음을 발견했습니다 (예 :) xdotool keyup 204.
Adam Spiers

1
@Adam Spiers가 저를 집어 넣었습니다. 제 사건의 키업 코드는 204와 같은 xmodmap 코드 였고 keysymdef.h를 사용하면 도움이되지 않았습니다. xmodmap 키 코드를 보려면 다음을 시도하십시오 DISAPLAY=:1 xmodmap -pk | grep -iP 'alt|meta|super|hyper'.. 디스플레이 번호를 깨진 VNC 디스플레이 번호로 변경해야합니다.
srking

나는 당신 DISPLAY=:1이 위의 의견 을 의미한다고 생각합니다 .
Adam Spiers

1
xdotool/ /에 대한 --clearmodifiers옵션을 지원합니다 – 아마도이 답변이 작성되었을 때 없었을까요? 나는 그것이 효과 가있을 것으로 기대한다 . ( 키를 지정해야합니다. "공백"은 임의입니다.)keykeydownkeyupxdotool keyup --clearmodifiers spacexdotool keyup
Rory O'Kane

6

내 시스템의 경우 게시 된 솔루션이 xdotool종종 붙어있는 키를 다루지 setxkbmap않았으며 실행 이 내 시스템에서 아무것도 달성하지 못하는 것으로 나타났습니다.

내가 지금까지 발견 한 해결책은 틀림없이 사용하는 것 x11vnc입니다. 특히 다음 명령을 사용합니다.

x11vnc -deny_all -clear_keys -timeout 1

-clear_keys여기서 핵심 부분입니다. x11vnc종료 될 때 누른 키를 모두 지우 도록 지시 합니다. 연결하지 않고 1 초 후에 종료하도록 -timeout 1지시 x11vnc하고 -deny_all해당 창 중에 아무도 연결할 수 없도록합니다.

때때로 멈추는 키는 데스크탑과의 의미있는 상호 작용을 방해합니다.이 경우 ssh를 통해 다음을 실행합니다.

env DISPLAY=:0 XAUTHORITY=/home/[username]/.Xauthority x11vnc -deny_all -clear_keys -timeout 1

4

인수없이 "setxkbmap"을 사용합니다. 키보드를 재설정하는 것 같습니다. 키보드가 완전히 작동하지 않을 때 마우스로 사용할 수있는 "단축키"가 패널에 있습니다.


0

x11vnc대답은 독창적이지만 설치하는 경우 x11vnc청산 수정만을위한 것은 잔인한 것 같아, 여기에 사용하는 배쉬 해결책 xmodmap -pm의 출력이 알려진 모든 수정에의 keyup을 발행하려면. 16 진수에서 10 진수 키코 드로의 변환은 Bash의 산술 확장에 의존합니다.

for KEYCODE in $(xmodmap -pm | grep -Pio '(?<=\b0x)[0-9a-f]+\b'); do

    echo -e "xdotool keyup $((16#$KEYCODE))\n" >&2
    xdotool keyup $((16#$KEYCODE))

done

키보드 단축키에서 실행하는 경우 sleep 1시작 부분에 추가 (물리적 키를 놓을 수 있도록)하는 것이 좋습니다. echo표준 에러로는 물론, 필요하지 않습니다; 나는 ~/.xsession-errors이런 식으로 내 파일 을 검사 할 수 있기를 원합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.