如何将多媒体键重新映射为蓝牙键盘上的功能键?

如何将多媒体键重新映射为蓝牙键盘上的功能键?

我有一台罗技蓝牙多设备键盘 K480,安装后只需按照蓝牙配对,默认设置会将功能键映射为多媒体键,因此我必须按住才能fn访问F1F2F3等。

这对我来说非常违反直觉,我想重新映射它,以便我可以直接访问功能并使用多媒体键fn

罗技蓝牙多设备键盘 K480

这是F1不按住fn再按住。

KeyPress event, serial 37, synthetic NO, window 0x4e00001,
root 0xd6, subw 0x0, time 63445847, (-438,408), root:(284,460),
state 0x10, keycode 180 (keysym 0x1008ff18, XF86HomePage), same_screen YES,
XLookupString gives 0 bytes: 
XmbLookupString gives 0 bytes: 
XFilterEvent returns: False

KeyRelease event, serial 37, synthetic NO, window 0x4e00001,
root 0xd6, subw 0x0, time 63445922, (-438,408), root:(284,460),
state 0x10, keycode 180 (keysym 0x1008ff18, XF86HomePage), same_screen YES,
XLookupString gives 0 bytes: 
XFilterEvent returns: False

KeyPress event, serial 37, synthetic NO, window 0x4e00001,
root 0xd6, subw 0x0, time 63446510, (-438,408), root:(284,460),
state 0x10, keycode 67 (keysym 0xffbe, F1), same_screen YES,
XLookupString gives 0 bytes: 
XmbLookupString gives 0 bytes: 
XFilterEvent returns: False

KeyRelease event, serial 37, synthetic NO, window 0x4e00001,
root 0xd6, subw 0x0, time 63446597, (-438,408), root:(284,460),
state 0x10, keycode 67 (keysym 0xffbe, F1), same_screen YES,
XLookupString gives 0 bytes: 
XFilterEvent returns: False

答案1

罗技似乎在 Linux 以外的各种操作系统上提供了一个特殊的驱动程序,它通过向键盘发送一个未记录的魔术命令来完成这种交换。

有些人监视了通信,以找到发送到其他一些类似罗技键盘的代码,例如 第760章810。你可以尝试其中之一。

如果失败,您可以使用xmodmap交换键分配。我们看到您的键盘根据是否按下 Fn 发送 2 个不同的键码。用于xmodmap -pke列出文件中的所有键映射,然后仅保留引用所需键码的键映射。例如你会有

keycode  67 = F1 F1 F1 F1 F1 F1 XF86Switch_VT_1
keycode 180 = XF86HomePage NoSymbol XF86HomePage

等等。简单地反转数字:

keycode 180 = F1 F1 F1 F1 F1 F1 XF86Switch_VT_1
keycode  67 = XF86HomePage NoSymbol XF86HomePage

然后将此文件名作为参数传递以xmodmap使其更新映射。

答案2

您可以将此代码放入名为“/home/youruser/k480”的脚本中并运行它。将重新映射您的罗技按键。

xmodmap -e "keycode 180 = F1 F1 F1 F1 F1 F1"
xmodmap -e "keycode  23 = F2 F2 F2 F2 F2 F2"
xmodmap -e "keycode 135 = F3 F3 F3 F3 F3 F3"
xmodmap -e "keycode 166 = F4 F4 F4 F4 F4 F4"
xmodmap -e "keycode 225 = F5 F5 F5 F5 F5 F5"
xmodmap -e "keycode 173 = F6 F6 F6 F6 F6 F6"
xmodmap -e "keycode 172 = F7 F7 F7 F7 F7 F7"
xmodmap -e "keycode 171 = F8 F8 F8 F8 F8 F8"
xmodmap -e "keycode 121 = F9 F9 F9 F9 F9 F9"
xmodmap -e "keycode 122 = F10 F10 F10 F10 F10 F10"
xmodmap -e "keycode 123 = F11 F11 F11 F11 F11 F11"
xmodmap -e "keycode 118 = F12 F12 F12 F12 F12 F12"

答案3

我找到了这个博客,Ubuntu 上的 Logitech K480 和“fn 按钮”默认行为,这似乎解决了与您描述的相同的问题:

默认情况下,此键盘(据我所知,罗技的类似键盘)默认启用“媒体按钮”,即 f1-f12 将充当媒体按钮,并且通过按 fn 按钮 + f1-f12 可以访问功能按钮。对于工作来说,这确实是不能接受的。我根据 Mario Scholz 对 K810 的工作对 Logitech K480 进行了此修复。源代码在这里:

github 上的 K480 修复

我所做的就是重新跟踪他的步骤,在运行win7的虚拟机中,我安装了罗技的SetPoint软件,并调试了蓝牙设备的输出。对于 K480,我得到:

on (bingo!)
> to keyboard
ffff8801d2173000 2960870190 S Bo:2:013:2 -115 16 = 0c200c00 08004200 a210ff08 1c000000
< from keyboard ffff8801ed13b000
1204929370 C Bi:2:013:2 0 29 = 0c201900 15004200 a111ff08 1b000100 00000000 00000000 00000000 00

off
> to keyboard
ffff88062b7db0c0 3001832891 S Bo:2:013:2 -115 16 = 0c200c00 08004200 a210ff08 1c010000
< from keyboard ffff8801ed368b40
1227979618 C Bi:2:013:2 0 29 = 0c201900 15004200 a111ff08 1b010100 00000000 00000000 00000000 00 

请注意,发送至键盘的消息以十六进制“a2”开头,来自键盘的消息以“a1”字节开头。总而言之,它工作正常,我也将设备 ID 更新为 0xb330,而 K810 为 0x319。就我个人而言,我喜欢这个键盘,它的按键“下降”效果很好,而且间距恰到好处——非常适合快速编写代码:)。

相关内容