IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Mac电脑键盘映射的最轻量方法

    ern发表于 2023-09-18 09:45:02
    love 0

    Mac电脑键盘几经更新,第一行现在都是系统功能键。其中例如音量、屏幕亮度等使用频率挺高的,但我也会不时有个想法,如果个别按键能自己定义就更好了,比如F5的听写、F6的勿扰模式,对我的作用不大,甚至还会误触造成干扰。

    几种思路

    这几天研究了一下,大致有以下几种思路可以解决问题:

    1. 安装Karabiner Elements,这是个非常强大的键盘映射软件,有多平台版本,而且是共享软件,迭代好多版本了,稳定靠谱
    2. 在系统设置里将媒体键改回成F1~F12,然后通过Keyboard Maestro或者Better Touch Tools将F1~F12中需要的部分,重新赋予媒体功能。例如,可以用KM重新将F1映射成调低屏幕亮度的功能,过程中就可以对F5~6按需映射成其他功能。KM的功能还挺全的,这里有个可以直接用的案例。这方法算是另辟蹊径吧。好处是,这样映射出来的功能可以比较丰富,比如可以调用脚本、打开某个程序之类的,而且KM或BTT安装面本来就很广。
    3. 直接研究键盘映射,这也是本文主要介绍的方法。适合映射很少的一些键位,不想太多第三方软件常驻后台。

    最轻量级的就是方法3了,也是无意中在这里的讨论中发现,然后花了点时间研究尝试。

    具体方法

    直接以将F6改造成锁屏并启动屏保来讲解方法:

    直接映射方法的本质是,macOS里有个hidutil指令,通过设置UserKeyMapping就可以实现基于HID键码的映射。也就是,当系统底层接收到键码A,我们通过这个指令让操作系统当键码B来处理。

    第一步,通过USB键盘的HID键码规范来查你需要的两个键码。在USB Implementers Forum的网站上有键码表,2023年初发布了当前的最新版HID Usage Tables 1.4。这规范看起来是个天书,但是我们重点需要看的是这么三张表格:Consumer Page(P125开始的表格)、Keyboard Page(P89开始的表格)、Generic Desktop Page(P32开始的表格)。
    现有的F6实际功能是Do Not Disturb,查P33倒数第二行可以看到“System Do Not Disturb”,对应的第一列代码9B,这个表格的开头章节是0x01,所以
    请记住0x10000009B这个代码。类似的,我想把它替代成锁屏或关闭屏幕,这个类型的操作在Consumer Page里,P130中间“AL Terminal Lock/Screensaver”,对应代码是19E,这一章开头的大类代码是0x0C,组合得到0x0C0000019E。所以,我们要做的就是将0x10000009B映射成0x0C0000019E。

    这里的三张表是各有侧重的,总体来说,媒体键的主要功能是在Consumer Page里,音量、屏幕亮度、键盘亮度、启动特定软件之类都在这里。而Keyboard Page是普通键盘,比如原生的F6(也就是macOS里按Fn+F6),就在这里可以找到。Generic Desktop Page用得不多,现有的F1~12里,就只有F6(DND)是在这个表里。表格最后一列的链接,点击过去是对相应功能的展开说明,如果不确定简略说明是不是你想的那个功能,可以参考。

    我也整理了一个附表,是主要功能键和一些常见功能的HID键码。

    找到键码以后就可以进入代码环节了:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.local.KeyRemapping</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/bin/hidutil</string>
            <string>property</string>
            <string>--set</string>
            <string>{"UserKeyMapping":[
                {
                  "HIDKeyboardModifierMappingSrc": 0x10000009B,
                  "HIDKeyboardModifierMappingDst": 0x0C0000019E
                },
                {
                  "HIDKeyboardModifierMappingSrc": 键A,
                  "HIDKeyboardModifierMappingDst": 键B
                }
            ]}</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
    </plist>
    

    可以看到,上面代码中,HIDKeyboardModifierMappingSrc就是原键码,HIDKeyboardModifierMappingDst是目标键码。注意代码是示例,需要自己修改以后才能使用。

    将这个文件保存成~/Library/LaunchAgents/com.local.KeyRemapping.plist,即个人资源库的LaunchAgents路径下。

    最后启用这个配置,可以选择直接重启,也可以用下面指令来立即启用:

    launchctl load -Fw ~/Library/LaunchAgents/com.local.KeyRemapping.plist
    

    如果想反复测试或者修改了plist后还需要重载,那么用下面的指令可以取消加载:

    launchctl unload ~/Library/LaunchAgents/com.local.KeyRemapping.plist
    

    附表:常见功能的HID键值

    键 媒体功能 HID键码
    F1 减低屏幕亮度 0x0C00000070
    F2 增加屏幕亮度 0x0C0000006F
    F3 Expose 0xFF0100000010
    F4 Spotlight(AC Search) 0xC00000221
    F5 Dictation 0xC000000CF
    F6 勿扰模式(Do Not Disturb) 0x10000009B
    F7 重播 0x0C000000B4
    F8 播放/暂停 0x0C000000CD
    F9 快进 0x0C000000B3
    F10 静音
    F11 减小音量 0x0C000000EA
    F12 增加音量 0x0C000000E9
    减少键盘背光 0xFF00000009
    增强键盘背光 0xFF00000008
    锁屏/屏保 0x0C0000019E
    Launchpad 0x0C000002A2
    Dashboard 0xFF0100000002

    其他参考资料

    在Apple开发文档里也有HID Usage Tables,不过个人觉得还不如上面规范的PDF容易用,优势是,规范是面向多平台和设备的,这个开发文档可以让你知道哪些在Apple的系统和设备上有实现。

    最后,有国外网友把常用的映射做成了一个方便的网页工具,还是开源的,懒得自己研究的可以尝试。



沪ICP备19023445号-2号
友情链接