枚举Windows中可用的键盘布局

时间:2011-04-12 14:37:43

标签: c++ winapi mfc

是否可以枚举所有当前可用的键盘布局。可用我的意思是用户可以通过按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;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

函数GetKeyboardLayoutList似乎可以获得最需要的信息。返回的信息是HKL的数组,HANDLE的值类似于

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

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

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