列举Windows中可用的键盘布局

Enumerating the available keyboard layouts in Windows

本文关键字:键盘 布局 Windows 列举      更新时间:2023-10-16

是否有可能列举所有当前可用的键盘布局?所谓可用,我的意思是用户可以通过按Alt+Shift(或任何他选择的快捷方式)切换到它们,也就是说,它们在语言栏的菜单中。

或者,检查语言栏中是否有特定的布局也是有用的。


编辑:

非常感谢@oleg,我终于做了一个可以工作的函数:

bool IsActiveKeyboardLayout(DWORD dwPrimaryLangID)
{
    TCHAR buf[KL_NAMELENGTH];
    GetKeyboardLayoutName(buf);
    DWORD dwActiveLangID = 0;
    _stscanf(buf, _T("%X"), &dwActiveLangID);
    if (dwPrimaryLangID == PRIMARYLANGID(dwActiveLangID))
        return true;
    return false;
}
bool IsKeyboardLayoutPresent(DWORD dwPrimaryLangID) 
{
    if (IsActiveKeyboardLayout(dwPrimaryLangID))
        return true;
    DWORD dwThreadID = GetCurrentThreadId();
    HKL hOld = GetKeyboardLayout(dwThreadID);
    for (;;)
    {
        ActivateKeyboardLayout((HKL) HKL_NEXT, 0);
        if (hOld == GetKeyboardLayout(dwThreadID))
            return false;
        if (IsActiveKeyboardLayout(dwPrimaryLangID))
        {
            ActivateKeyboardLayout(hOld, 0);
            return true;
        }
    }
}

GetKeyboardLayoutList函数似乎得到最接近您需要的信息。返回的信息是HKL的数组,HANDLE的值如

0x04070407 -德文0x04110411 -日语0x04190419 -俄语0xe0200411 -日语

如果你对某种语言有多个输入法或者对一种语言有多个布局你可以在语言栏菜单中看到更多的项目。在64位操作系统上,值0x04070407将表示为0x0000000004070407。

在这里您可以阅读更多关于输入区域设置标识符和键盘布局的信息。