teclado tecla presionada evento detectar c# .net windows keyboard keyboard-layout

tecla - keypress c#



Averigüe cuándo se cambia el diseño del teclado (2)

Estoy escribiendo un teclado en pantalla y me gustaría volver a dibujar mi diseño tan pronto como se modifique el diseño del teclado.

Actualmente llamo:

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

en cada pulsación de tecla para averiguar si el diseño ha cambiado. No funciona si el usuario cambia el diseño con el mouse hasta que se presiona la tecla.

Me gustaría saber si hay alguna forma de recibir una notificación cuando se modifique el diseño del teclado de la ventana de primer plano actual, de modo que pueda volver a dibujar mi diseño tan pronto como se produzca el cambio.


Parece que el diseño del teclado se almacena aquí: HKEY_CURRENT_USER / Keyboard Layout / Preload

Cuando cambié los idiomas del teclado, el orden de los ajustes allí cambió.

Entonces, posiblemente podría monitorear la entrada del registro. Aquí hay una forma:

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


Hay una manera ...

Primero necesita registrar su aplicación para capturar los cambios de ventana en primer plano:
Use SetWinEventHook con EVENT_SYSTEM_FOREGROUND (y WINEVENT_OUTOFCONTEXT como es .NET) para eso.

Si eso sucede: use su solución GetKeyboardLayout para obtener el diseño actual de esa ventana.

A continuación, utilice un Windows Hook local (probablemente lo esté utilizando a bajo nivel, globalmente para capturas de teclas) con WH_CALLWNDPROC y el hilo de la nueva ventana en primer plano.
Escuche los mensajes WM_INPUTLANGCHANGE en esa ventana para recibir cambios en el diseño.
(Es posible que desee desenganchar / reacoplar después de otro cambio de primer plano)