I am writing an onscreen keyboard and would like to redraw my layout as soon as keyboard layout is changed.
Currently I call:
GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL));
on every key press to find out if the layout has changed. It does not work if user changes the layout by mouse, until key is pressed.
I would like to know if there is any way to get notified
when the keyboard layout of the current foreground window is changed,
so I can redraw my layout as soon as the change happens.
There is a way …
First you need to register your application to capture foreground window changes:
Use
SetWinEventHookwithEVENT_SYSTEM_FOREGROUND(andWINEVENT_OUTOFCONTEXTas it’s .NET) for that.If that happens: Use your
GetKeyboardLayoutsolution for getting the current layout of that window.Then use a local Windows Hook (you’re probably using it low-level-globally for key captures) with
WH_CALLWNDPROCand the thread of the new foreground window.Listen to
WM_INPUTLANGCHANGEmessages to that window to receive changes to the layout.(You may want to unhook/rehook after another foreground change)