Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 枚举Windows中可用的键盘布局_C++_Winapi_Mfc - Fatal编程技术网

C++ 枚举Windows中可用的键盘布局

C++ 枚举Windows中可用的键盘布局,c++,winapi,mfc,C++,Winapi,Mfc,是否可以枚举所有当前可用的键盘布局。“可用”是指用户可以通过按Alt+Shift或他选择的快捷方式切换到它们,即它们位于语言栏的菜单中 或者,检查语言栏中是否有特定布局也很有用 编辑: 多亏了@oleg,我终于实现了一个有效的函数: bool IsActiveKeyboardLayout(DWORD dwPrimaryLangID) { TCHAR buf[KL_NAMELENGTH]; GetKeyboardLayoutName(buf); DWORD dwActiv

是否可以枚举所有当前可用的键盘布局。“可用”是指用户可以通过按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;
        }
    }
}
该函数似乎可以获取最接近您所需的信息。返回的信息是HKL的数组,句柄的值如下

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

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


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

类似于从windows提取键盘布局