@pshevnin

Почему раскладка языка в Windows не переключаются?

Я пытаюсь написать код, который переключает языковую раскладку в Windows, но код по какой то причине не переключает раскладку системы
void SwitchKeyboardLayout()
{
    const int MAX_LAYOUTS = 256;
    std::vector<HKL> layouts(MAX_LAYOUTS);

    int numLayouts = GetKeyboardLayoutList(MAX_LAYOUTS, layouts.data());

    HKL currentLayout = GetKeyboardLayout(0);

    if (numLayouts == 0)
    {
        std::cerr << "Failed to get keyboard layout list." << std::endl;
        return;
    }

    std::cout << "Current layout: " << std::hex << currentLayout << std::dec << std::endl;
    std::cout << "Number of installed keyboard layouts: " << numLayouts << std::endl;
    for (int i = 0; i < numLayouts; i++)
    {
        std::cout << "Layout " << i + 1 << ": " << std::hex << layouts[i] << std::dec << std::endl;
    }

    // Найти текущую раскладку в списке
    int currentIndex = -1;
    for (int i = 0; i < numLayouts; i++)
    {
        if (layouts[i] == currentLayout)
        {
            currentIndex = i;
            break;
        }
    }

    if (currentIndex == -1)
    {
        std::cerr << "Current keyboard layout not found in the list." << std::endl;
        return;
    }

    // Переключиться на следующую раскладку
    int nextIndex = (currentIndex + 1) % numLayouts;
    HKL nextLayout = layouts[nextIndex];

    // Используем ActivateKeyboardLayout для смены раскладки
    HKL result = ActivateKeyboardLayout(nextLayout, KLF_SETFORPROCESS);
    if (result == NULL)
    {
        std::cerr << "Failed to switch keyboard layout." << std::endl;
    }
    else
    {
        std::cout << "Switched to the next keyboard layout: " << std::hex << result << std::dec << std::endl;
    }
}


Current layout: 0x4090409
Number of installed keyboard layouts: 3
Layout 1: 0x4090409
Layout 2: 0x4050405
Layout 3: 0x4190419
Switched to the next keyboard layout: 0x4090409
Current layout: 0x4050405
Number of installed keyboard layouts: 3
Layout 1: 0x4090409
Layout 2: 0x4050405
Layout 3: 0x4190419
Вот лог (системная раскладка при этом не меняется)
  • Вопрос задан
  • 92 просмотра
Решения вопроса 2
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
Используйте эмуляцию хоткея для переключения языка - например через вызов системного API SendInput. Это самый простой и надежный вариант.
Ответ написан
Комментировать
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Читайте документацию: https://learn.microsoft.com/en-us/windows/win32/ap...

This function only affects the layout for the current process or thread.


Эта функция не может поменять раскладку в системе.

Попробуйте вот это: https://learn.microsoft.com/en-us/windows/win32/ap...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы