AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 509000
Accepted
umbro_tracksuit
umbro_tracksuit
Asked: 2019-03-28 06:21:03 +0800 CST2019-03-28 06:21:03 +0800 CST 2019-03-28 06:21:03 +0800 CST

我可以从 Linux 上的第二个键盘启动宏和快捷方式吗?

  • 772

我有一个小数字键盘,我想用它来启动宏和快捷方式,以及我的常规键盘。我可以将宏和快捷方式附加到这些键(即,小键盘 1 最小化活动窗口),但我的主键盘小键盘也激活了快捷方式。

我想要一种方法让辅助键盘完全独立运行,然后为其附加快捷方式。

这是我从中得到的输出xinput。

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ LVT Recon gaming mouse                    id=10   [slave  pointer  (2)]
⎜   ↳ LVT Recon gaming mouse                    id=11   [slave  pointer  (2)]
⎜   ↳ Corsair Corsair K30A Gaming Keyboard      id=13   [slave  pointer  (2)]
⎜   ↳ SIGMACHIP USB Keyboard                    id=18   [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)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ Corsair Corsair K30A Gaming Keyboard      id=12   [slave  keyboard (3)]
    ↳ Corsair Corsair K30A Gaming Keyboard      id=14   [slave  keyboard (3)]
    ↳ LVT Recon gaming mouse                    id=15   [slave  keyboard (3)]
    ↳ Corsair Corsair K30A Gaming Keyboard      id=16   [slave  keyboard (3)]
    ↳ SIGMACHIP USB Keyboard                    id=17   [slave  keyboard (3)]
    ↳ SIGMACHIP USB Keyboard                    id=19   [slave  keyboard (3)]
keyboard-shortcuts keyboard
  • 3 3 个回答
  • 6209 Views

3 个回答

  • Voted
  1. Best Answer
    Ulrich Schwarz
    2019-03-28T10:40:18+08:002019-03-28T10:40:18+08:00

    虽然我的其他答案可能适用于大多数 Linux,即使它们已有多年历史,但 SystemD 和 udev 实际上使事情变得更容易:

    • 用于lsusb查找附加键盘的供应商和产品代码。(在我的例子中,它是供应商 145F,产品 0177。确保字母为大写。)

    • 创建一个文件/etc/udev/hwdb.d/90-extra-keyboard.hwdb,内容与此类似:

    evdev:input:b0003v145Fp0177*
     KEYBOARD_KEY_7005b=stopcd
    

    第一行标识设备:v 后面的四个字母是供应商代码,p 后面是产品代码,来自上一步。每一行都将扫描码映射到符号名称。要获取扫描码,请运行evtest:

    Event: time 1553711252.888538, -------------- SYN_REPORT ------------
    Event: time 1553711257.656558, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70059
    Event: time 1553711257.656558, type 1 (EV_KEY), code 79 (KEY_KP1), value 1
    

    要找出符号名称的用途,请查看以下行#define KEY_…列表/usr/include/linux/input-event-codes.h:

    #define KEY_PLAYPAUSE           164
    #define KEY_PREVIOUSSONG        165
    #define KEY_STOPCD              166
    #define KEY_RECORD              167
    
    • 通过运行重新构建和加载内部数据库systemd-hwdb update; udevadm trigger

    • evtest通过再次运行或在设置中分配快捷方式来验证新设置是否有效。

    在应用程序中尝试此操作时,请记住,如果您的桌面环境已经使用该快捷方式,则应用程序甚至不会看到按键。

    • 11
  2. Ulrich Schwarz
    2019-03-28T07:12:18+08:002019-03-28T07:12:18+08:00

    原则上,是的。当我最后一次在 2012 年这样做时,要走的路是尝试告诉 Linux,第二个键盘非常奇怪,实际上意味着XF86VolumeUp它发送按键时Num 1,或者其他什么。幸运的是,您可以通过这种方式使用标准键盘上不存在的很多键码。

    让我们为一个键运行这个:

    • 用于xev | grep -i key查找额外键盘上按键的键码。例如,我将keypap 9使用键码 81 进行操作。(注意:我的额外键盘有一个标记为“00”的键,但它发送了两次“0”,我不知道如何处理。)
          KeyPress event, serial 38, synthetic NO, window 0x4400001,
            state 0x10, keycode 81 (keysym 0xffb9, KP_9), same_screen YES,
          KeyRelease event, serial 39, synthetic NO, window 0x4400001,
            state 0x10, keycode 81 (keysym 0xffb9, KP_9), same_screen YES,
            request MappingKeyboard, first_keycode 8, count 248
    
    • 检查setxkbmap -query您的(主)键盘的规则。我们将尝试将您的额外键盘变成该布局上的十几个媒体键。对我来说是
    rules:      evdev
    model:      pc105
    layout:     de
    variant:    nodeadkeys
    
    • 中找到足够的条目/usr/share/X11/xkb/symbols/inet。右侧是应用程序将看到的内容,可能带有 shift 键修饰符等,左侧是扫描码。我会选择这个,因为我的键盘没有“计算器”键:
    key <I148>   {      [ XF86Calculator        ]       };
    
    • 在其中创建一个/usr/share/X11/xkb/keycodes/将扫描码映射到键码的文件(从第一步开始)。是的,这似乎倒退了。我的文件名为 trustkeypad,如下所示:
    default xkb_keycodes "trustkeypad" {
        minimum= 8;
        maximum= 255;
    
        // keypad 9
        <I148> = 81;
    };
    
    • 编译这个文件xkbcomp -xkb trustkeypad

    • 试试看setxkbmap -v -v -device 17 -keycodes (filename)。( 17 是您的 id xinput。)我的结果如下所示:

    Warning! Multiple definitions of keycodes
             Using command line, ignoring rules file
    Applied rules from evdev:
    rules:      evdev
    model:      pc105
    layout:     de
    variant:    nodeadkeys
    Trying to build keymap using the following components:
    keycodes:   trustkeypad
    types:      complete
    compat:     complete
    symbols:    pc+de(nodeadkeys)+inet(evdev)
    geometry:   pc(pc105)
    

    这看起来不错,尤其是 keycodes 行。如果您xev现在运行,您应该会看到正在生成的新符号。唉,我现在只获得了一半的胜利:

    KeyPress event, serial 39, synthetic NO, window 0x4600001,
        root 0x168, subw 0x0, time 24043275, (1666,897), root:(1670,950),
        state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
        XLookupString gives 0 bytes: 
        XmbLookupString gives 0 bytes: 
        XFilterEvent returns: False
    
    KeyRelease event, serial 39, synthetic NO, window 0x4600001,
        root 0x168, subw 0x0, time 24043403, (1666,897), root:(1670,950),
        state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
        XLookupString gives 0 bytes: 
        XFilterEvent returns: False
    
    KeyPress event, serial 39, synthetic NO, window 0x4600001,
        root 0x168, subw 0x0, time 24043403, (1666,897), root:(1670,950),
        state 0x10, keycode 77 (keysym 0x0, NoSymbol), same_screen YES,
        XLookupString gives 0 bytes: 
        XmbLookupString gives 0 bytes: 
        XFilterEvent returns: False
    
    KeyRelease event, serial 39, synthetic NO, window 0x4600001,
        root 0x168, subw 0x0, time 24043411, (1666,897), root:(1670,950),
        state 0x10, keycode 77 (keysym 0x0, NoSymbol), same_screen YES,
        XLookupString gives 0 bytes: 
        XFilterEvent returns: False
    

    但是在我意外地使 X 崩溃了几次之后(不要认为将 keycodes 文件中的最小值设置得更高会有所帮助),这种情况就消失了。也许一个简单的重启可以在这一点上提供帮助。成功后,你应该只得到类似的东西

    KeyPress event, serial 38, synthetic NO, window 0x3e00001,
        root 0x168, subw 0x0, time 26443862, (930,972), root:(934,1025),
        state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
        XLookupString gives 0 bytes: 
        XmbLookupString gives 0 bytes: 
        XFilterEvent returns: False
    
    KeyRelease event, serial 39, synthetic NO, window 0x3e00001,
        root 0x168, subw 0x0, time 26444022, (930,972), root:(934,1025),
        state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
        XLookupString gives 0 bytes: 
        XFilterEvent returns: False
    
    

    您可以在您的用户设置中验证您现在可以为该键分配一个快捷方式,它会说它已分配给计算器键。

    这里仍然缺少:弄清楚如何使其成为标准设置,也包括重新启动。这可能涉及查看 udev,并且https://help.ubuntu.com/community/Custom%20keyboard%20layout%20definitions可能很有用,即使它有一个可追溯到 2014 年的“过时”标签。

    • 3
  3. znd0
    2021-02-04T02:56:13+08:002021-02-04T02:56:13+08:00

    所描述的hwdb修改方法不适用于连接的多个 USB 键盘,因为不同 USB 键盘上相同按钮的扫描码相同,您将重新映射所有连接的 USB 键盘上的按钮。

    扫描码仅在内置笔记本电脑的键盘和 USB 键盘之间有所不同。

    我会尝试这种 python 方法(在https://www.youtube.com/watch?v=Arn8ExQ2Gjg的评论中找到它)

    1. 安装 Python 及其evdev模块(稍后您将需要它)

    2. cd到 /dev/input/by-id/

    3. 在没有插入键盘的情况下,ls.

    4. 插入键盘,然后ls。将有两个新的符号链接。记下它在文件系统中的绝对位置(例如 /dev/input/by-id/usb-0c45_USB_WIRED_KEYBOARD_event-kbd )

    5. 退出终端。创建一个python文件并将其放入其中:

      from evdev import InputDevice, categorize, ecodes
      dev = InputDevice('/absolute/position/of/device')
      dev.grab()
      
      
      for event in dev.read_loop():
           if event.type == ecodes.EV_KEY:
                key = categorize(event)
           if key.keystate == key.key_down:
                if key.keycode == 'KEY_ESC':
                     print("Hello, world!")
      
    6. 现在,如果您按下第二个键盘上的退出键,它将打印“Hello, world!”

    • 2

相关问题

  • 睡眠快捷指令 lubuntu?

  • 无法使用键盘键入分音符

  • 读取 PS/2 键盘的 /dev/input/

  • 在 Vim 中删除到命令行末尾

  • 使 Apple 键盘设置在 ../hid_apple/parameters/ 中持久化

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve