2011-11-27 10 views
10

Piszę na klawiaturze ekranowej i chciałbym przerysować mój układ zaraz po zmianie układu klawiatury.Dowiedz się, kiedy układ klawiatury został zmieniony

Obecnie wzywam:

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

na każdym naciśnięciu klawisza, aby dowiedzieć się, czy układ został zmieniony. Nie działa, jeśli użytkownik zmienia układ za pomocą myszy, dopóki nie zostanie naciśnięty klawisz.

Chciałbym wiedzieć, czy istnieje sposób uzyskania powiadomienia , gdy układ klawiatury bieżącego okna pierwszego planu zostanie zmieniony, , więc mogę przerysować układ, gdy tylko nastąpi zmiana.

Odpowiedz

7

Jest na to sposób ...

Najpierw musisz zarejestrować swoją aplikację do przechwytywania zmian w planie okno:
Korzystając SetWinEventHook z EVENT_SYSTEM_FOREGROUND(i WINEVENT_OUTOFCONTEXT jak to. NET) do tego.

Jeśli tak się stanie: Użyj rozwiązania GetKeyboardLayout, aby uzyskać bieżący układ tego okna.

następnie użyć lokalnego Windows Hook(prawdopodobnie używasz go na niskim poziomie, globalnie dla kluczowych zrzuty) z WH_CALLWNDPROC i nić nowym oknie planie.
Wysłuchaj wiadomości do tego okna, aby otrzymać zmiany w układzie.
(Możesz odczepić/rehook po drugim planie zmianami)

0

To wygląda układ klawiatury jest przechowywany tutaj: HKEY_CURRENT_USER \ Keyboard Layout \ Preload

Kiedy zmienił języków klawiatury, kolejność ustawień nie zmieniło.

Można więc monitorować wpis rejestru. Oto jeden ze sposobów:

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

+0

Zamówienie wartości w HKEY_CURRENT_USER \ Keyboard Layout \ preload zmienia się tylko po zmianie domyślnego układu klawiatury lub dodać układ nowa klawiatura – Nejchy

Powiązane problemy