如何在按下键盘上的某个键后暂时禁用该键?

如何在按下键盘上的某个键后暂时禁用该键?

我把啤酒洒在了我的机械键盘上,从那以后,每当我按下它时,它就会重复“a”键(是的,我已经清理过好几次了,用过氨基酸酒精等)。我尝试使用“弹跳键”来缓解此问题,但此功能暂时禁用所有键在他们之后氨基酸换句话说,“弹跳键”妨碍了我快速打字的能力,无论何时我需要输入一个带有重复字母的单词(例如单词“letter”中的“t”)或重复AAA特莱莉快速按下退格键。

(好吧,我不会在剩余的文本中留下重复,但你可以看到它出现在 m氨基酸频率)

如果有帮助的话,我使用 xev 来确定操作系统正在接收的命令序列,看起来每次“a”重复都是因为键盘多次发送所需的序列(KeyPress 后跟 KeyRelease,然后 KeyPress 后跟 KeyRelease)。换句话说,按键没有停留在“KeyPress”状态。它正在重复仿佛我按下并释放它多次。

我看到其他人问过同样的问题,但解决方案实际上并不是我想要的。例如,第一个答案中提出的解决方案这个问题禁用自动重复,但这对我来说不起作用,因为“a”不会卡在“按下”状态。同一问题中的第二个答案也不起作用,因为它会在按下问题键后禁用整个键盘。我只是想暂时禁用“a”键,并且仅在很短的时间内(~50ms)禁用“a”键。

幸运的是,我很少需要在打字时重复字母“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 的建议时,我使用“3”作为键盘 ID,并将键码保留为 38。但是,键仍然重复。

答案1

在脚本文件中尝试此操作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 keyboardidxinput test id_numberakey press 38idid

  • 将和38中的数字改为按键的按键代码。您可以通过运行并按下按键来找到这个数字。"key press 38"xmodmap -e 'keycode 38 = ';xmodmap -e 'keycode 38 = a A';axeva

  • 0.5将中的数字更改为要禁用sleep 0.5;该键的所需时间(以秒为单位)。a


创建和使用脚本文件的步骤:

  1. 通过在终端中运行以下命令在编辑器中创建并打开文件:
nano ~/no_aa.sh
  1. 复制并粘贴上述代码(修改后)进入编辑器。

  2. 保存脚本文件并按Ctrl+X然后按退出编辑器Y

  3. 通过在终端中运行以下命令使脚本文件可执行:

chmod +x ~/no_aa.sh
  1. 通过在终端中运行以下命令来运行脚本:
bash ~/no_aa.sh
  1. 保持终端打开并a在其他应用程序中测试密钥,例如在 LibreOffice Writer 中写作。

相关内容