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

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

때로는 전체 화면 VirtualBox 게스트를 사용할 때 컴퓨터 간 시너지 효과를 사용할 때 이상한 키 수정자가 켜지는 문제가 발생합니다. 키보드에 해당 항목이 있는 경우(예: Shift_L) 해당 항목을 클릭하기만 하면 해당 상태가 재설정되고 계속해서 소문자를 입력할 수 있습니다. 하지만 그 중 일부는 내 키보드에 전혀 매핑되지 않아서(예: ISO_Level3_Shift), 전혀 끌 수 없습니다!

어떻게 재설정하나요? 이제 내가 할 수 있는 일은 컴퓨터를 다시 시작하는 것뿐인데, 해결 방법이 다소 어색합니다.

내가 원하는 것은 가능한 모든 키보드 수정자를 인위적으로 "클릭"하여 해당 상태를 재설정할 수 있는 프로그램입니다. 할 수 있나요?

저는 Mint 14(Ubuntu 12.10 Quantal의 클론)를 사용합니다.

답변1

이미 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

답변2

내 시스템의 경우 게시된 솔루션이 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

답변3

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

답변4

대답 x11vnc은 깔끔하지만 x11vnc수정자를 지우기 위해 설치하는 것이 약간 과도해 보인다 면 xmodmap -pm알려진 모든 수정자에 대해 키업을 내보내는 출력을 사용하는 Bash 솔루션이 있습니다. 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(물리적 키를 놓을 시간을 주기 위해) 처음에 추가하는 것이 좋습니다. 물론, echostderr이 필수는 아닙니다. 단지 내 파일에 그러한 출력이 있는지 확인할 수 있기를 원합니다 ~/.xsession-errors.

관련 정보