有时,当我在使用全屏 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 echo
stderr 不是必需的;我只是希望能够检查我的~/.xsession-errors
文件是否有这样的输出。