2009-05-29 4 views
2

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

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

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

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

ответ

5

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

GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL)) 

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

+0

Это не будет работать из службы (хорошо, это будет работать с интерактивной службой, но использование интерактивных сервисов не рекомендуется и не будет работать в новых версиях Windows). – jdigital

+0

Я не знаю, почему я об этом не думал. @jdigital, он действительно будет работать, потому что у службы есть рабочий процесс в сеансе пользователя. Благодаря! –