跳转至

Windows 上用 CapsLock 切换中英文

微软输入法切换中英文的按键选择有 Ctrl、Shift、Ctrl+Space,但它们都是其他软件常用的修饰符/快捷键,肯定没法用。后来,我用一个纯英文键盘布局和一个纯中文键盘布局,靠 Win+Space 切换,但这个快捷键按着也挺麻烦。

受 MacOS 的启发,我决定改用 CapsLock 切换中英文。恰好,我平时切换大小写用的都是 Shift。CapsLock 放在那么好的位置却不用,很可惜。

按键映射

使用 Windows PowerToys 的键盘管理器映射 CapsLock 到 Win+Space。

同步指示灯

按键都重映射了,指示灯放着不用也怪可惜的。我笔记本键盘上 CapsLock 指示灯就在这个按键右上角,改成中英文指示灯刚好。灯亮时就是中文模式,灯暗时就是英文模式。

代码开源在 GitHub 上:stalomeow/CapsLockLed-IME。特地用纯 C 写的,几乎没有什么开销。大体思路:依靠 Windows 全局钩子 监听键盘布局变化(HSHELL_LANGUAGE)事件,然后根据当前布局设置指示灯状态。

检查是否为中文键盘布局

BOOL IsChineseKeyboardLayout()
{
    CHAR name[KL_NAMELENGTH];

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

    return FALSE;
}

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

设置指示灯

需要引入头文件 ntddkbd.h

具体的思路参考 windows - Is it possible to control capslock light without actual capslocking? - Stack Overflow