Перечисление доступных раскладок клавиатуры в Windows - PullRequest
2 голосов
/ 12 апреля 2011

Можно ли перечислить все доступные в настоящее время раскладки клавиатуры.Под доступным я подразумеваю, что пользователь может переключаться на них, нажимая Alt + Shift (или любой другой выбранный им ярлык), т.е. они находятся в меню языковой панели.

В качестве альтернативы, было бы полезно проверить, доступен ли конкретный макет на языковой панели.


Редактировать:

Большое спасибо@ Олег, я наконец-то сделал функцию, которая работает:

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 Ответ

3 голосов
/ 12 апреля 2011

Функция GetKeyboardLayoutList , кажется, получает наиболее близкую информацию к тому, что вам нужно. Возвращаемая информация - это массив HKL, HANDLE имеет значения типа

0x04070407 - немецкий 0x04110411 - японский 0x04190419 - русский 0xe0200411 - японский

Если у вас есть для одного языка более одного метода ввода или более одного макета для одного языка, вы можете иметь больше элементов, как вы можете видеть в меню языковой панели. В 64-битной операционной системе значение 0x04070407 будет представлено как 0x0000000004070407.

Здесь вы можете узнать больше об идентификаторе языка ввода и раскладках клавиатуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...