跳转至

Windows 上自定义按键映射

针对我的奇怪需求,使用 Win API 实现了

  • 禁用 num lock
  • caps lock 映射成 win + space
  • 将键盘布局状态同步到 caps lock 的 LED 指示灯

代码开源在 stalomeow/KeyboardRemapper

安装

使用 Scoopstalomeow/ScoopBucket 安装。

sudo scoop install stalo/kbdremap

开机会自动启动。如果进程意外终止,可以使用命令 kbdremap 重启。

按键映射

使用 LowLevelKeyboardProc 实现,代码可以借鉴 PowerToys KeyboardManager

同步指示灯

使用 全局钩子 监听键盘布局变化(HSHELL_LANGUAGE)事件,然后根据当前布局设置指示灯状态。

检查是否为中文键盘布局

static bool IsChineseKeyboardLayout()
{
    CHAR name[KL_NAMELENGTH];

    // https://learn.microsoft.com/en-us/globalization/keyboards/kbdus_2
    return GetKeyboardLayoutNameA(name) && strcmp(name, "00000804") == 0;
}

KeyboardLayoutName 就是 Keyboard identifier,简体中文对应的是 "00000804"

设置指示灯

需要引入头文件 ntddkbd.h。具体的思路参考 windows - Is it possible to control capslock light without actual capslocking? - Stack Overflow

评论