1

Linux で X11/Xorg を使用している場合xinput、キーボードを無効にするために使用すると (たとえばxinput set-prop $ID "Device Enabled" 0)、「キーアップ」イベントは送信されません (キーボードを無効にしたため)。これは、コマンド ラインでそのコマンドを入力する場合に顕著です。「Enter」を押しているように動作します。これは、Enter キーから指を離す前にコマンド (キーボードを無効にする) が実行されるためです。

これについては、このバグ ( https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-input-evdev/+bug/724280 ) とこのブログ投稿 ( http://blog.yjl.im/ ) で説明されています。 2010/12/using-xinput-to-disable-keyboard-mouse.html )。

キーボードを無効にする必要があるプログラムを作成しており、この問題を回避したいと考えています。「現在押されているすべてのキーを解放する」方法/コマンドはありますか (「キーボードを無効にする」コマンドの直後に実行できます)? または、「現在押されているすべてのキーのリストを取得する」コマンド/方法と、「キーリリース」イベントを手動/プログラムで送信する方法はありますか? (この方法で、キーボードを無効にし、押されているキーを確認してから、それらのキーを「離す」ことができます)。

これは可能ですか?

4

3 に答える 3

1

「キーボードを無効にする必要があるプログラムを書いていますが、この問題を回避したいのです」

キーボードのフォーカスを取得してすべての入力を破棄することの何が問題になっていますか?

xinputはかなり鈍器であり、2年以上前のバグに遭遇しているため、修正される可能性は低いと言えます。確かに、バグはおそらくそれよりはるかに古く、それを利用している誰かによって「予期された動作」と見なされる可能性があります。

于 2012-05-25T17:20:22.497 に答える
1

あなたが経験するのは、キーボードイベントがターミナルエミュレータによって処理され、シェルがどのように反応するかという特異性です。Enterキーを押すと、シェルは指定されたコマンドを実行し、Enterキーが押さxinput ...れる前にコマンドが終了します。キーボードが無効になるため、キーリリースイベントはイベント処理にさえ入りません。

これはバグではなく、機能です。

回避方法:実際にデタッチを実行する前にすべてのキーが押されるのを待つか、xinputコマンドの前にスリープを追加します(これらは両方とも競合状態であるため、100%信頼できるわけではありません)。

つまり、これをシェルコマンドラインに配置します

sleep 1 ; xinput set-prop $ID "Device Enabled" 0

実際にxinputを無効にする前に、最初に1秒間スリープします。エンターキーを押したままにしないと、希望の状態で出てくるはずです。

于 2012-05-26T20:49:58.170 に答える
0

xinput set-prop $ID "Device Enabled" 0 の後の任意のキー クリックをシミュレートするだけです。コマンドの前にスリープ時間は必要ありません

xinput set-prop $ID "Device Enabled" 0 ; xdotool key z
于 2014-05-03T23:04:14.543 に答える