Узнайте, когда изменяется раскладка клавиатуры
Я пишу экранную клавиатуру и хочу перерисовать свой макет, как только будет изменен раскладка клавиатуры.
В настоящее время я вызываю:
GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL));
при каждом нажатии клавиши, чтобы узнать, изменился ли макет. Он не работает, если пользователь меняет макет мышью, пока не будет нажата клавиша.
Я хотел бы знать, есть ли способ получить уведомление
когда макет клавиатуры текущего окна переднего плана изменяется,
поэтому я могу перерисовать свой макет, как только произойдет изменение.
Ответы
Ответ 1
Есть способ...
Сначала вам необходимо зарегистрировать приложение для захвата изменений переднего плана:
Используйте SetWinEventHook
с EVENT_SYSTEM_FOREGROUND
(и WINEVENT_OUTOFCONTEXT
как это .NET) для этого.
Если это произойдет: используйте решение GetKeyboardLayout
для получения текущего макета этого окна.
Затем используйте локальный Windows Hook (вы, вероятно, используете его на уровне низкого уровня для глобальных захватов) с WH_CALLWNDPROC
и поток нового окна переднего плана.
Слушайте WM_INPUTLANGCHANGE
сообщения в это окно, чтобы получать изменения в макете.
(Возможно, вам захочется отцепить/перехватить после другого изменения переднего плана)
Ответ 2
Похоже, что раскладка клавиатуры хранится здесь: HKEY_CURRENT_USER\Макет клавиатуры \Preload
Когда я сменил языки клавиатуры, изменился порядок настроек.
Таким образом, вы можете отслеживать запись в реестре. Здесь один из способов:
http://www.codeproject.com/KB/system/registrymonitor.aspx