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:
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)