Как определить раскладку клавиатуры для другого процесса (Windows)? - PullRequest
3 голосов
/ 29 мая 2009

Я работаю над программой, которая должна записывать и воспроизводить нажатия клавиш. Основной процесс запускается как служба, поэтому для записи нажатий клавиш требуется программа настройки.

Проблема возникает, когда системная раскладка клавиатуры по умолчанию (скажем) английская, а раскладка клавиатуры пользователя на данный момент (скажем) немецкая. Пользователь вводит символ «ü» в интерфейс конфигурации, который должным образом записывается и сохраняется.

Теперь пользователь запускает Блокнот и пытается воспроизвести нажатие клавиши, что выполняется дочерним элементом службы. При преобразовании ввода для передачи в SendInput мы вызываем VkKeyScan, что говорит нам, что на этой клавиатуре невозможно воспроизвести этот символ (помните, что раскладка клавиатуры по умолчанию - английский).

Что я действительно хотел бы сделать, так это синхронизировать раскладки клавиатуры службы и текущего приложения переднего плана, чтобы служба могла воспроизводить любой символ, который пользователь может использовать с помощью клавиатуры. GetKeyboardLayout работает только в текущем процессе. Это должно выполняться как в 32-, так и в 64-битном режиме, поэтому перехват сообщений ... не является предпочтительным:).

1 Ответ

5 голосов
/ 05 июня 2009

Чтобы получить раскладку клавиатуры для окна переднего плана:

GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL))

Звучит так, будто вы записываете символы вместо нажатия клавиш. Вместо отправки нажатий клавиш при воспроизведении, вы можете использовать SendMessage для отправки сообщений WM_CHAR с записанными символами вместо генерации нажатий клавиш?

...