キーボード修飾子のリリースを強制する方法


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を使用して簡単に実現できますが、そうでない場合はどの修飾子キーシムが定義されているのかわかりません。それらを見つける1つの可能な方法は、解析すること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ディスプレイ番号に変更する必要があります。
15年

DISPLAY=:1上記のコメントであなたが意味したと思います。
アダムスパイアーズ

1
xdotool/ /の--clearmodifiersオプションをサポートしています-この答えが書かれたとき、そうではなかったのでしょうか?私はそれがうまくいくと期待しています。(キーを指定する必要があります。「スペース」は任意です。)keykeydownkeyupxdotool keyup --clearmodifiers spacexdotool keyup
ロリーオケイン

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クリア修飾子のためだけのことはやり過ぎのように思える、ここではbashのソリューションを使用していることだ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は、最初に追加する(物理的なキーを解放する時間を確保する)ことをお勧めします。echostderrにはもちろん、必要はありません。~/.xsession-errorsこのような出力をファイルで確認できるようにしたいだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.