如何强制释放键盘修饰符


18

有时,当我在使用全屏VirtualBox guest虚拟机的情况下在两台计算机之间使用协同增效功能时,我会陷入一些奇怪的按键修饰符被打开的状态。如果它们存在于我的键盘上(例如Shift_L),则只需轻按它,它们的状态将重置,然后我可以继续输入小写字母。但是其中一些根本没有映射到我的键盘(例如ISO_Level3_Shift),因此我根本无法关闭它们!

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

我想要的是一个可以人为地“敲击”所有可能的键盘修饰符的程序,因此它们的状态将被重置。能做到吗

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

Answers:


22

如果已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

1
大!我还发现,未分配的密钥可能会通过密钥代码(例如)解开xdotool keyup 204
亚当·斯皮尔斯

1
@Adam Spiers提示我。我的案例的键入代码是xmodmap代码,例如204,使用keysymdef.h并没有帮助。要查看xmodmap密钥代码,请尝试:DISAPLAY=:1 xmodmap -pk | grep -iP 'alt|meta|super|hyper'。您需要将显示号更改为损坏的VNC显示号。
2015年

我认为您的意思DISPLAY=:1是上述评论。
亚当·斯皮尔斯

1
xdotool支持/ / 的--clearmodifiers选项–编写此答案时可能没有吗?我希望那可以。(要求指定密钥;“空格”是任意的。)keykeydownkeyupxdotool keyup --clearmodifiers spacexdotool keyup
罗里·奥凯恩

6

我发现对于我的系统,所涉及的发布解决方案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

4

我使用没有参数的“ setxkbmap”。似乎重置了键盘。我的面板上有一个“快捷方式”,可以在键盘完全无法使用时与鼠标一起使用。


0

x11vnc回答是巧妙的,但如果安装x11vnc用于清除改性剂似乎只是矫枉过正,这里有一个解决方案猛砸使用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在开始时添加(以便有时间释放物理键)。该echo标准错误是没有必要的,当然,我只是希望能够检查我的~/.xsession-errors文件以得到这样的输出。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.