如何强制释放键盘修饰符

如何强制释放键盘修饰符

有时,当我在使用全屏 VirtualBox 来宾时使用计算机之间的协同作用时,我会遇到一些打开的奇怪的按键修改器的问题。如果它们存在于我的键盘上(例如 Shift_L),我只需点击它,它们的状态就会重置,我可以继续输入小写字母。但其中一些根本没有映射到我的键盘(例如 ISO_Level3_Shift),所以我根本无法将它们关闭!

如何重置它们?现在,我所能做的就是重新启动计算机,但这是一个相当尴尬的解决方案。

我想要的只是一些可以人为地“点击”所有可能的键盘修饰符的程序,这样它们的状态就会被重置。能做到吗?

我使用 Mint 14(Ubuntu 12.10 Quantal 的克隆版)。

答案1

如果你已经xdotool安装了,你可以简单地使用

xdotool keyup ISO_Level3_Shift

它向 X 服务器发送一个按键释放(当然是 ISO_Level3_Shift)事件。

但您想要一个程序来释放所有修饰键。人们可以使用 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退出时清除所有按下的键。-timeout 1告诉x11vnc您在没有连接的情况下 1 秒后退出,并-deny_all确保在该窗口期间没有人可以连接。

有时,卡住的按键会阻止与桌面进行任何有意义的交互,在这种情况下,我将通过 ssh 执行以下命令:

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

答案3

我使用不带参数的“setxkbmap”。看来要重置键盘了我的面板中有一个“快捷方式”,当键盘完全无法操作时,我可以使用鼠标来使用它。

答案4

答案x11vnc很巧妙,但如果x11vnc只是为了清除修饰符而安装似乎有点矫枉过正,那么这里有一个 Bash 解决方案,它使用 的xmodmap -pm输出向所有已知的修饰符发出 keyup。从十六进制到十进制键码的转换依赖于 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建议在开头添加(以便有时间释放物理键)。当然, to echostderr 不是必需的;我只是希望能够检查我的~/.xsession-errors文件是否有这样的输出。

相关内容