如何强制执行 fn+箭头键 (home、end、pgup、pgdn) 的按键释放事件

如何强制执行 fn+箭头键 (home、end、pgup、pgdn) 的按键释放事件

这是之前问过的同一个问题,但“解决方案”大致是“更新并重启后问题消失”,这纯属偶然,因为我尝试安装相同的发行版并进行更新,但没有任何变化。问题没有得到具体解决。

经过两周的网上搜索寻找答案,我想我已经正确地缩小了问题范围,但我太菜了,无法弄清楚如何编写解决方案。

有人可以帮忙吗?

  1. 我认为问题出在启动(BIOS)上,但我不知道如何更改它(或者从我读到的内容来看,我真的不想冒险)。因此,解决方案可能是...

  2. 一种强制释放按键事件的方法。这就是我陷入困境的地方。由于 18.04 已将 /etc/udev 目录中的“keymap”文件替换为“hwdb”和“rules”文件,我尝试了各种排列组合,在新建的文件 70-keyboard-force-release.hwdb 中添加行,并在 .rules 文件中添加相同的行,但都无济于事。

SHOWKEY 显示了扫描和密钥代码,但我不知道该如何处理它们。我尝试使用其他匹配对作为模板,但还是搞不懂。

有人能帮我找出正确的代码吗?

描述:我刚刚在全新的 Dell Inspiron 11-3162 上安装了 LUBUNTU 18.04 LTS x86_64,但“Home | End | PgUp | PgDn”功能不起作用。

在这个特定的键盘上,你必须按 Fn+LeftArrow 键来进入 Home 键,或按 Fn+RightArrow 键来进入 End 键,按 Fn+UpArrow 键来进入 PgUp 键,按 Fn+DownArrow 键来进入 PgDn 键。最疯狂的是,我第一次使用这些功能时,它能正常工作。但如果我第二次尝试进入“home”或“end”键,什么也没发生。第一次我必须重新启动才能再次执行此操作,第二次则什么也没发生。

此外,功能键还可以与其他功能一起使用...例如,Fn+F2 和 F3 可降低/增加音量;Fn+F12 可使屏幕变亮;Fn+F1 可使声音静音。

更多信息:我忘了提到我的发行版:带键盘的 Inspiron 11-3162 上的 Lubuntu 18.04。

键盘描述打印输出: 键盘描述打印输出

问题:这是一篇关于这个问题的帖子,我描述了“没有解决方案”。非常好的描述:Dell Inspiron 11-3162 Home | End | PgUp | PgDn 键不起作用

这是 BIOS 吗?另一个用户也有类似的问题,但让我认为这是 BIOS(根据评论):Fn 键向下

BIOS 还是 GRUB?另一个用户也有类似的问题,但他的评论让我认为是 BIOS 或 GRUB 的问题;我试过这里的解决方案,但无济于事:使三星 RV510 笔记本电脑上的功能键正常工作

失败的解决方案:这是我认为最接近的尝试,但我无法让它发挥作用。https://github.com/arduino/dfu-utils-cross/blob/master/eudev-3.1.5/hwdb/60-keyboard.hwdb

有类似内容:https://www.dell.com/community/Linux-General/Dell-Inspiron-3179-keyboard-not-sends-KEY-RELEASE-events-key-up/td-p/5114299

我试过:

在 etc/udev/hwdb 中:

evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDell*:pn*Inspiron 11-3162:pvr*
KEYBOARD_KEY_c9=!pageup
KEYBOARD_KEY_d1=!pagedown
KEYBOARD_KEY_c7=!home
KEYBOARD_KEY_cf=!end

evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDell*:pn*
KEYBOARD_KEY_0xe0 0x49=!pageup
KEYBOARD_KEY_0xe0 0x51=!pagedown
KEYBOARD_KEY_0xe0 0x47=!home
KEYBOARD_KEY_0xe0 0x4f=!end

evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDell*:pn*
KEYBOARD_KEY_0x49=!pageup
KEYBOARD_KEY_0x51=!pagedown
KEYBOARD_KEY_0x47=!home
KEYBOARD_KEY_0x4f=!end

evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDell*:pn*
KEYBOARD_KEY_0x49=!104
KEYBOARD_KEY_0x51=!109
KEYBOARD_KEY_0x47=!102
KEYBOARD_KEY_0x4f=!107

在/etc/udev/rules.d中:

evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDell*:prn*
KEYBOARD_KEY_c9=!104
KEYBOARD_KEY_d1=!109
KEYBOARD_KEY_c7=!102
KEYBOARD_KEY_cf=!107

几乎所有其他信息,我都放在了下面,以防任何信息对您有帮助。作为一个 Linux 新手,我发现它很有用,但也许我只是在原地打转。我想我需要去某个地方上一门课程,但那是另一个话题。无论如何,以下是我尝试过的更多东西:

失败的解决方案:我尝试了这里的解决方案,但我太文盲了,我不确定我是否正确翻译了“解决方案”。https://github.com/lu-zero/udev/blob/master/src/keymap/95-keyboard-force-release.rules

我试过:编辑 /usr/lib/udev/rules.d/70-keymap.rules,将以下行添加到其他三星特定行

ACTION=="remove", GOTO="force_release_end"
SUBSYSTEM!="serio", GOTO="force_release_end"
KERNEL!="serio*", GOTO="force_release_end"
DRIVER!="atkbd", GOTO="force_release_end"

ENV{DMI_VENDOR}=="[iI][nN][sS][pP][iI][rR][oO][nN]*", ATTR{[dmi/id]product_name}=="11-3162*", RUN+="keyboard-force-release.sh $devpath Inspiron 11-3162"

LABEL="force_release_end"

失败的解决方案:这是另一篇类似的文章,我尝试使用它来寻找另一种解决方案,但没有成功。http://natjohan.info/linux-on-samsung-np900x3c.html

失败的解决方案:这是我尝试过的另一个解决方案,称为 xdotool。https://unix.stackexchange.com/questions/60007/how-to-force-release-of-a-keyboard-modifiers/64716我尝试后什么也没做:

sudo xdotool keyup
sudo xdotool keyup --clearmodifiers
sudo xdotool key --clearmodifiers
sudo xdotool --clearmodifiers

失败的解决方案:我了解到尝试使用 keymap 做一些事情是浪费,因为它已被 /etc/udev/hwdb 和 /etc/udev/rules 取代,但我尝试使用本文中的一些信息来提出解决方案,但无济于事:https://ask.fedoraproject.org/en/question/37598/how-to-create-custom-keymaps-now-that-libudevkeymap-is-gone/

背景:这是对我最有帮助的文章之一,但我仍然不知道该如何编写正确的代码。背景:自从 DOS 时代以来,我成为 Windows 的奴隶,之后我的 Linux 经验总共只有大约 3 周,我发现以下针对该问题的文章有些帮助。背景:我使用了一种名为 showkey 的东西来显示按键代码,这些代码显示了按下但不释放:

showkey 输出: showkey 输出

您可以看到第一次按下按键时的情况,但由于没有释放事件,因此它会继续,直到我按下任何其他键。按键尝试的顺序是 fn+左箭头(home,代码 102)、fn+右箭头(end,代码 107)、fn+上箭头(pgup,代码 104)和 fn+下箭头(pgdn,代码 109)。页面底部的输出仅用于按下箭头,以显示它们具有不同的代码,并且在按下事件后立即具有释放事件。按照上面的相同顺序(左、右、上、下),代码为 105、106、103、108(与下面的 evtest 显示的相同)

背景:我使用了一种叫做 evtest 的东西来显示按键代码和事件:按键的顺序是 fn+左箭头(home,代码 105)、fn+右箭头(end,代码 106)、fn+向上箭头(pgup,代码 103)和 fn+向下箭头(pgdn,代码 108),

测试输出: 事件测试输出

更多信息:在观看 The Coding Train 的 ytube 视频“3.3:事件(mousePressed、keyPressed)- 处理教程”后,也许对我来说有必要明确指出,我确实需要这个 fn+arrow 功能来在 Excel 和 Word 中使用 home、end、pgup、pgdn。虽然在文件管理器、synaptics、互联网和其他地方工作会很好,但我的首要任务是 Excel 和 Word。

信息更新:我忘了提到我认为这可能是 BIOS 问题的另一个原因是我的 Inspiron 11-3162 具有经过认证的 Ubuntu 版本 14.04,但其 BIOS 是 1.0,而我的是 2.2。我尝试安装该发行版,但无济于事。我还在某处读到 BIOS 包含硬件(包括键盘)的说明。我工作的地方(埃默里大学)的 IT 人员告诉我,BIOS 可能不会发送 fn + 箭头的按键释放,因为 Windows 不需要它。他还告诉我,如果检测到非 Windows 操作系统,BIOS 可能无法正确加载(感谢微软故意让打破 Windows 的从属链变得更加困难)

信息更新:很抱歉更新得这么频繁,但我这样做是希望它们能帮助 Linux 社区中的某些人……尤其是因为我自己仍在尝试解决这个问题。无论如何,这里有一个链接,指向一个比我更高级的人(这并不难),他遇到了同样的问题,并且尝试了我尝试的许多方法 - 但都无济于事。

答案1

在 Lubuntu 20.04 上遇到了完全相同的问题。我写这篇文章是为了让大家知道什么对我有用(感谢https://www.dell.com/community/Linux-General/Dell-Inspiron-3179-keyboard-not-sends-KEY-RELEASE-events-key-up/mp/5114301/highlight/true#M15475

首先,可以从 /lib/udev/hwdb.d/60-keyboard.hwdb 文件中的文档中获得大量有用信息。正是在这里,我了解了“AT 键盘”和 AT 键盘维护的扫描代码“强制释放”列表(当硬件不需要时,使驱动程序合成释放事件)。

实际所做的更改:

  1. 创建了一个文件 /etc/udev/hwdb.d/70-keyboard.hwdb,其中包含以下内容:
### for Dell Inspiron 11-3168

evdev:atkbd:dmi:bvn*:bvr*:bd*:svnDell*:pnInspiron*3168:pvr*
 KEYBOARD_KEY_c7=!home                              # Fn+Left Home
 KEYBOARD_KEY_cf=!end                               # Fn+Right End
 KEYBOARD_KEY_c9=!pageup                            # Fn+Up Page Up
 KEYBOARD_KEY_d1=!pagedown                          # Fn+Down Page Down
  1. 运行以下命令来激活更改:
# systemd-hwdb update
# udevadm trigger --verbose /dev/input/event4
  1. 重新启动(虽然不确定这是否真的有必要)

希望这可以帮助!

答案2

我认为有两种方法可以实现此目的:

  1. 使用命令行:a) 获取键盘映射的输出xkbcomp -xkb $DISPLAY xkbmap并找到您要交换的键 b) 然后使用代码交换xcape -e 'Caps_Lock=Escape'(以 Caps_Lock 和 Escape 为例)

  2. 使用 GUI 应用程序:a) 从 repo 安装应用程序sudo apt install xbindkeys xbindkeys-config b) 启动 xbindkeys-config GUI 并进行相应更改。

希望这可以帮助

相关内容