Как Windows меняет раскладку клавиатуры? - PullRequest
0 голосов
/ 19 апреля 2020

Горячие клавиши для этого:

Alt+Shift - Windows 7 и Win button + Space в Win 8 и 10.

Программно я могу сделать это, используя WM_INPUTLANGCHANGEREQUEST, но это не так Windows. Я пытаюсь выяснить, как Windows меняет макет. Используя spy ++ Я понял, что Windows отправляет WM_INPUTLANGCHANGE сообщение, которое меняет макет, поэтому я попробовал сам:

SendMessage(myHWND, WM_INPUTLANGCHANGE, 0xCC, 0x4190419);

У меня есть привязка клавиатуры, когда нажимаю f1 do отправка сообщения активному элементу управления текущего активного окна.

, но это не сработало, хотя сообщения в spy ++ одинаковы:

img

первое использование " Windows Горячая клавиша "/" Панель задач "для изменения макета, все работает. Второе мое сообщение, оно не сработало. Я что-то упускаю, почему сообщение работает для "Windows", но не для меня.

WM_INPUTLANGCHANGEREQUEST работает, но оно останавливает некоторые определенные приложения, и я хотел бы выяснить способ Windows меняется ли макет, чтобы избежать этого.

- update .

В DxO Photolab 3 он зависает при использовании WM_INPUTLANGCHANGE в диалоге «Экспорт на диск»:

При изменении макета с использованием метода "Windows" (горячая клавиша / панель задач): 2020 04 19 - 22'11'40_rect Работает нормально, без зависания.

Отправка WM_INPUTLANGCHANGE: 2020 04 19 - 22'10'06_rect Получил WM_INPUTLANGCHANGEREQUEST и заморозил: 2020 04 19 - 22'05'07_rect

Также подобное зависание я видел в Skype, MS Office, Adobe After Effects.

1 Ответ

1 голос
/ 24 апреля 2020

С WM_INPUTLANGCHANGEREQUEST ,

Когда функция DefWindowProc получает сообщение WM_INPUTLANGCHANGEREQUEST, активирует новый язык ввода и уведомляет приложение изменения, отправив сообщение WM_INPUTLANGCHANGE.

Мы можем просмотреть детали через spy ++.

1

Только после того, как приложение получит сообщение WM_INPUTLANGCHANGEREQUEST, оно активирует новую локаль ввода и уведомит приложение об изменении, отправив сообщение WM_INPUTLANGCHANGE.

Простой тест:

2

Насколько я понимаю, на самом деле работает сообщение WM_INPUTLANGCHANGEREQUEST, но я не нашел альтернативного API для завершения его работы.

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

См. @ ответ Бармака Шемирани ,

Видимо WM_INPUTLANGCHANGEREQUEST терпит неудачу, если цель само по себе является диалоговым приложением (я не знаю почему!) В случае возникновения проблемы вы можете отправить WM_INPUTLANGCHANGEREQUEST сообщение потомкам диалога (в дополнение к WM_INPUTLANGCHANGEREQUEST сообщению самого диалога)

Обновлено:

Мой тестовый код:

#include <Windows.h>

int main()
{       
    HWND hwnd = (HWND)0x00070EBA; // hwnd of skype
    while (1)
    {
        Sleep(1000);
        PostMessage(hwnd, WM_INPUTLANGCHANGEREQUEST, 0, 0);
    }
    return 0;
}

Результат:

2

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