web-dev-qa-db-ja.com

キーボードのキーを押した後、一時的に無効にする方法は?

私はメカニカルキーボードにビールをこぼしました。それは、押すたびに「a」キーを繰り返す傾向があるためです(はい、何度か掃除しましたが、使用しましたaalcoholなど)。 「バウンスキー」を使用してこの問題を軽減しようとしましたが、この機能は、aaが押された後、一時的にall keysを無効にします。言い換えると、「バウンスキー」は、繰り返し文字(単語「文字」の「t」のように<)または繰り返しを含む単語を入力する必要があるときに、すばやく入力する能力を妨げます。 aaaバックスペースをすばやく押します。

(OK私は残りのテキストに繰り返しを残しませんが、maadenning frequencyで発生することがわかります)

それが役立つ場合は、xevを使用して、OSが受信しているコマンドのシーケンスを正確に判断しました。これは、「a」が繰り返されるたびに、キーボードが目的のシーケンスを複数回送信しているためです(KeyPressの後にKeyRelease、次にKeyPressその後、再びKeyReleaseが続きます)。言い換えると、キーは「KeyPress」状態で固定されていません。それはそれ自身を繰り返していますのように私はそれを複数回押して、離しました。

他の人が同じ質問をするのを見てきましたが、解決策は実際に私が求めているものではありません。たとえば、 この質問 の最初の回答で提案された解決策はオートリピートを無効にしますが、「a」が「Pressed」状態でスタックしないため、私にとっては機能しません。同じ質問の2番目の回答も問題のあるキーが押された後にキーボード全体を無効にするため、機能しません。 「a」キーを一時的に無効にして、「a」キーのみを非常に短い時間(〜50ms)だけ無効にしたい

幸いなことに、タイプするときに文字「a」を繰り返す必要はほとんどありません。そのため、オートコレクトのようなものを使用するソリューションでもうまくいきます。できれば、xbindkeysを使用するソリューションを使用したいのですが、既にそのパッケージを使用して、マウスボタンを再マップしています。

編集:以下のコメントへの応答として、ここに「xinput list」と「xev」の出力があります:

$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ SINOWEALTH Game Mouse                     id=9    [slave  pointer  (2)]
⎜   ↳ EST Gaming keyboard                       id=12   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ SINOWEALTH Game Mouse Keyboard            id=10   [slave  keyboard (3)]
    ↳ EST Gaming keyboard                       id=11   [slave  keyboard (3)]
    ↳ EST Gaming keyboard                       id=13   [slave  keyboard (3)]
    ↳ Eee PC WMI hotkeys                        id=15   [slave  keyboard (3)]
    ↳ EST Gaming keyboard                       id=16   [slave  keyboard (3)]

$ xev
KeyPress event, serial 37, synthetic NO, window 0x7c00001,
    root 0x4e5, subw 0x0, time 188722500, (165,-16), root:(4636,676),
    state 0x10, keycode 38 (keysym 0x61, a), same_screen YES,
    XLookupString gives 1 bytes: (61) "a"
    XmbLookupString gives 1 bytes: (61) "a"
    XFilterEvent returns: False

KeyRelease event, serial 37, synthetic NO, window 0x7c00001,
    root 0x4e5, subw 0x0, time 188722576, (165,-16), root:(4636,676),
    state 0x10, keycode 38 (keysym 0x61, a), same_screen YES,
    XLookupString gives 1 bytes: (61) "a"
    XFilterEvent returns: False

@Raffaによる提案を実装する際、キーボードIDに「3」を使用し、キーコードを38のままにしました。しかし、キーはまだ重複しています。

2
Jdclark

これをbashスクリプトファイルで試してください。

#!/bin/bash

xinput test 11 |

while read pkc

        do
                if [[ "$pkc" =~ "key press   38" ]]
                        then
                                xmodmap -e 'keycode 38 = ';
                                sleep 0.5;
                                xmodmap -e 'keycode 38 = a A';
                fi

done
  • 11の番号xinput test 11をキーボードのデバイス番号に変更します。この番号はxinput listを実行して確認できます。 id番号がキーボードに適しているかどうかを確認する必要がある場合があります。そのためには、キーボードのid番号の前にslave keyboardを付けて選択し、次にxinput test id_numberを実行してターミナルでidを確認し、 a キーボードで。 key press 38のような出力が表示された場合、これは現在のキーボードの正しいid番号であり、出力がない場合は、出力が表示されるまで他のid番号のテストを続けます。

  • 38および"key press 38"およびxmodmap -e 'keycode 38 = ';のnuber xmodmap -e 'keycode 38 = a A';を、 a キー。この番号を見つけるには、xevを実行し、 a キー。

  • 0.5sleep 0.5;の数値を、 a 無効にするキー。


スクリプトファイルを作成して使用する手順:

  1. ターミナルで次のコマンドを実行して、エディターでファイルを作成して開きます。
nano ~/no_aa.sh
  1. 上記のコード(変更後)をコピーしてエディターに貼り付けます。

  2. スクリプトファイルを保存し、を押してエディターを終了します。 CtrlX 次に押します Y

  3. ターミナルで次のコマンドを実行して、スクリプトファイルを実行可能にします。

chmod +x ~/no_aa.sh
  1. ターミナルで次のコマンドを実行して、スクリプトを実行します。
bash ~/no_aa.sh
  1. ターミナルを開いたままにし、 a LibreOfficeライターで書くような他のアプリケーションのキー。
2
Raffa