2011-11-27 12 views
10

Sto scrivendo una tastiera su schermo e vorrei ridisegnare il mio layout non appena il layout della tastiera viene modificato.Scopri quando il layout della tastiera viene modificato

Attualmente mi chiamano:

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

su ogni pressione di un tasto per scoprire se il layout è cambiato. Non funziona se l'utente cambia il layout con il mouse, finché non viene premuto il tasto.

Vorrei sapere se c'è un modo per ricevere la notifica di quando il layout di tastiera della finestra di primo piano corrente è cambiato, così posso ridisegnare il mio layout non appena il cambiamento avviene.

risposta

7

C'è una via ...

primo luogo è necessario registrare l'applicazione per catturare le modifiche finestra in primo piano:
Usa SetWinEventHook con EVENT_SYSTEM_FOREGROUND(e WINEVENT_OUTOFCONTEXT come se fosse .NET) per quello.

Se ciò accade: utilizzare la soluzione GetKeyboardLayout per ottenere il layout corrente di tale finestra.

Poi utilizzare un locale Windows Hook(probabilmente stai usando basso livello-chiave a livello globale per la cattura) con WH_CALLWNDPROC e il filo della nuova finestra in primo piano.
Ascoltare i messaggi WM_INPUTLANGCHANGE in quella finestra per ricevere le modifiche al layout.
(Si consiglia di sganciare/Rehook dopo un altro cambiamento in primo piano)

0

Sembra che il layout di tastiera è memorizzato qui: HKEY_CURRENT_USER \ Keyboard Layout \ Preload

Quando ho cambiato lingue per la tastiera, l'ordine delle impostazioni lì è cambiato.

Quindi è possibile monitorare la voce del Registro di sistema. Ecco un modo:

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

+0

Ordine dei valori in HKEY_CURRENT_USER \ Keyboard Layout \ Preload modifiche solo quando si cambia layout di tastiera o aggiungere nuovi layout di tastiera – Nejchy