Узнайте, когда раскладка клавиатуры изменилась - PullRequest
11 голосов
/ 28 ноября 2011

Я пишу экранную клавиатуру и хотел бы перерисовать свою раскладку, как только раскладка клавиатуры изменится.

В настоящее время я звоню:

GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL));

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

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

Ответы [ 2 ]

8 голосов
/ 28 ноября 2011

Есть способ ...

Сначала вам нужно зарегистрировать приложение, чтобы зафиксировать изменения в окне переднего плана:
Используйте SetWinEventHook с EVENT_SYSTEM_FOREGROUND WINEVENT_OUTOFCONTEXT в качестве .NET) для этого.

Если это произойдет: используйте ваше решение GetKeyboardLayout для получения текущего макета этого окна.

Затем используйте локальный Windows Hook (вы, вероятно, используете его на низком уровне в глобальном масштабе для захвата ключей) с WH_CALLWNDPROC и нить нового окна переднего плана.
Прослушайте WM_INPUTLANGCHANGE сообщений в этом окне, чтобы получить изменения в макете.
(Вы можете захотеть отцепить / зацепить после другого изменения переднего плана)

0 голосов
/ 28 ноября 2011

Похоже, раскладка клавиатуры хранится здесь: HKEY_CURRENT_USER \ Раскладка клавиатуры \ Предварительная загрузка

Когда я менял языки клавиатуры, там менялся порядок настроек.

Таким образом, вы можете отслеживать запись в реестре. Вот один из способов:

http://www.codeproject.com/KB/system/registrymonitor.aspx

...