2011-11-27 19 views
10

Estoy escribiendo un teclado en pantalla y me gustaría volver a dibujar mi diseño tan pronto como se modifique la distribución del teclado.Averigüe cuándo se cambió el diseño del teclado

Actualmente me llaman:

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 cambia el diseño del teclado de la ventana actual de primer plano, , así puedo volver a dibujar mi diseño tan pronto como ocurra el cambio.

Respuesta

7

Hay un camino ...

Primero tendrá que registrar su aplicación para capturar los cambios ventana en primer plano:
Uso 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.

continuación, utilizar un local de Windows Hook(es probable que se esté usando, de bajo nivel, a nivel mundial para las capturas de claves) con WH_CALLWNDPROC y el hilo de la nueva ventana en primer plano.
Escuche WM_INPUTLANGCHANGE mensajes en esa ventana para recibir cambios en el diseño.
(Es posible que desee para desenganchar/rehook después de otro cambio en primer plano)

0

Parece que la disposición del teclado se almacena aquí: HKEY_CURRENT_USER \ Keyboard Layout \ Preload

Cuando cambié idiomas de teclado, el orden de configuración no ha cambiado.

Por lo tanto, podría supervisar la entrada del registro. Aquí está una manera:

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

+0

orden de los valores en HKEY_CURRENT_USER \ Keyboard Layout \ precarga cambia sólo cuando se cambia la disposición de teclado por defecto o añadir nuevo diseño de teclado – Nejchy

Cuestiones relacionadas