Узнайте, когда изменяется раскладка клавиатуры

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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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