如何检测全局按键

如何检测全局按键

我有一台华硕笔记本电脑,它有一个特殊的密钥,可以配置为启动任何软件(至少在 Windows 上)。

一般问题是:如何(全局)检测任何按键?

那么,如何检测用户按下这个键呢?

答案1

我通常会用来xev确定按键的扫描码,然后将其映射到我想要使用的任何操作xdo工具或者X绑定键

西夫

$ xev | grep -A2 --line-buffered '^KeyRelease' \
    | sed -n '/keycode /s/^.*keycode \([0-9]*\).* (.*, \(.*\)).*$/\1 \2/p'

运行上述xev命令后,您将弹出一个白色的小窗口。您需要将鼠标放在该窗口上,然后按问题键。当您按下各个按键时,按键的名称应该显示在终端中。

截屏

                   xev对话框的ss

将密钥映射到有用的东西

您可以创建将使用以下命令启动命令的快捷键组合xbindkeys例如,。我已经成功使用了X绑定键GNOME 3.8.4 就是为了这个目的。

我的使用量不大,但我喜欢为 Nautilus 创建键盘快捷键,以便在打开某些目录时启动。

例子

您需要首先确保xbindkeys已安装软件包。

然后,您需要运行以下命令(仅一次)来创建模板xbindkeys配置文件。

$ xbindkeys --defaults > /home/saml/.xbindkeysrc

创建文件后,您可以在文本编辑器中打开它并添加如下规则:

"nautilus --browser /home/saml/projects/path/to/some/dir"
  Mod4+shift + q

进行上述更改后,我们需要杀死它xbindkeys(如果它已经在运行),然后重新启动它。

$ killall xbindkeys
$ xbindkeys

现在,只要我输入Mod+ Shift+ QNautilus 就会打开并打开相应的文件夹。

使用 GNOME 的键盘小程序

如果您通过设置(系统设置键盘, 选择快捷方式选项卡并为您的浏览器添加新的自定义快捷方式。

   SS #1

使用图中的步骤 1-5,您也可以将命令映射到您的特殊键。

答案2

我想发布我刚刚测试过的各种工具的摘要。

我从谷歌搜索开始:linux查看按下的是什么键,这将我带到了以下地方。由于它们要么是封闭的,要么是偏离主题的,所以在这里发布我的总结是最合理的选择。

  1. [关闭:题外话]https://superuser.com/questions/248517/show-keys-pressed-in-linux
  2. [关闭:重复]https://askubuntu.com/questions/1197651/ubuntu-show-what-keys-are-pressed-in-real-time
    1. [“原始”、非重复问题]https://askubuntu.com/questions/30466/how-can-i-display-keyboard-shortcuts-as-i-press-them
  3. 这个问题在这里

以下是对每个地方的最佳答案的一些总结。我需要这个信息。所以我可以:

  1. 检测刚刚发生的卡住按键,以及
  2. 在 HID 键盘微控制器设备上工作,自从我卖了一台之后,我偶尔会这样做。

检测按键的各种方法总结

在 Linux Ubuntu 20.04 上测试。

  1. screenkey

    # Install it
    sudo apt update 
    sudo apt install screenkey
    
    # run it
    screenkey
    # it now displays a massive black bar at the bottom of your main monitor
    # whenever you press any key, showing all keys as they are pressed!
    
    # kill it
    
    # first, find its PID
    ps aux | grep screenkey
    # Sample output:
    #       $ ps aux | grep screenkey
    #       gabriel   215523  2.9  0.3 972900 59364 ?        Rl   10:27   0:00 /usr/bin/python3 /usr/bin/screenkey
    #       gabriel   215635  0.0  0.0   9040  2388 pts/0    S+   10:27   0:00 grep --color=auto screenkey
    # OR
    pgrep screenkey
    # Sample output:
    #       $ pgrep screenkey
    #       215523
    
    # now, kill that PID; ex:
    kill 215523
    

    我第一次了解到这个工具的地方:https://askubuntu.com/a/30468/327339

  2. sudo showkey

    # show numeric keycode key presses and releases (use Ctrl + C to exit)
    sudo showkey
    
    # show hex scancodes (use Ctrl + C to exit)
    sudo showkey -s 
    
    # show ASCII keycodes, including the actual letter or character pressed,
    # which is the most human-readable (use `Ctrl + D` to exit, NOT `Ctrl + C`!)
    sudo showkey -a
    

    来源:

    1. https://superuser.com/a/248568/425838
      1. 我在答案下的总结评论:https://superuser.com/questions/248517/show-keys-pressed-in-linux#comment2606625_248568
  3. https://www.keyboardtester.com/。在浏览器中测试您的按键,和/或查看按键是否卡住。我第一次了解到这个工具的地方:https://askubuntu.com/a/1197656/327339

  4. xev。使用完毕后,需要执行两个步骤来杀死它:

    1. 单击当前终端窗口之外的位置会导致终端窗口失去焦点。
    2. 单击返回终端窗口并按Ctrl+ C

    资料来源:

    1. 我第一次了解到这个工具的地方:https://askubuntu.com/a/1198027/327339
    2. 也可以看看:如何检测全局按键
  5. sudo evtest- 一个非常低级的工具;似乎是我在 USB HID 设备上工作所需的(我认为);效果很好!

    # Install it
    sudo apt update 
    sudo apt install evtest 
    
    # Run it
    
    # First, find your keyboard /dev/input/event number manually 
    sudo evtest  
    # Then, press Ctrl + C to kill it after it prints out all the events; you 
    # do NOT need to "Select the device event number" as it requests. Just hit
    # Ctrl + C.
    # Let's assume ours is "/dev/input/event4".
    
    # now, run the grab command with the above event number path
    sudo su -c 'sleep 1; timeout -k5 10 evtest --grab /dev/input/event4'
    
    # OR, if you know that `sudo evtest` only shows one output line with the
    # word "keyboard" in it, you can script the above two steps with this one
    # cmd like this. Notice that you can get a list of all input devices with 
    # `cat /proc/bus/input/devices`, as is done at the start of this cmd:
    input_event_num="$(cat /proc/bus/input/devices \
    | grep -B 1 -A 10 -i "keyboard" | awk 'NR==6 {print $4}')"; \
    path_to_keyboard="/dev/input/$input_event_num"; \
    sudo su -c "sleep 1; timeout -k5 10 evtest --grab $path_to_keyboard"
    

    来源:

    1. https://askubuntu.com/a/1197742/327339
      1. 另请参阅此答案下的评论。

其他参考:

  1. awk帮助:https://unix.stackexchange.com/a/89641/114401
  2. 我在哪里了解到cat /proc/bus/input/deviceshttps://stackoverflow.com/a/15052092/4561887

答案3

如果您无法确定哪些键盘按键不起作用,那么您可以使用键盘测试者.org

使用起来很简单。

相关内容