C ++ Win32 получить UTF8 Char с клавиатуры - PullRequest
4 голосов
/ 01 мая 2010

как бы я прочитал нажатия клавиш с помощью Win32 API? Я также хотел бы видеть их на международных клавишных, таких как немецкие умлауты.

спасибо

Ответы [ 2 ]

3 голосов
/ 06 мая 2010

Существует разница между нажатиями клавиш и генерируемыми ими символами.

На самом низком уровне вы можете опрашивать состояние клавиатуры с помощью GetKeyboardState. Так часто бывает, когда это делает вредоносная программа для кейлогинга, так как она требует наименьших привилегий и видит все, независимо от того, где находится фокус. Проблема с этим подходом (помимо необходимости постоянного опроса) заключается в том, что вы должны объединить состояние клавиатуры в нажатия клавиш, а затем нажатия клавиш в поток символов. Вы должны знать, как отображается клавиатура, вы должны сохранять состояние клавиш Shift, клавиш управления, клавиш Alt и т. Д. Вы должны знать об автоповторении, мертвых клавишах и, возможно, других сложностях.

Если у вас есть привилегии, вы можете установить клавиатуру, как упоминал Дженс в своем ответе.

Если у вас есть фокус, и вы консольное приложение, вы используете одну из функций для чтения со стандартного ввода. В Windows трудно получить истинный ввод Unicode. Обычно вы получаете так называемые символы ANSI, которые соответствуют текущей кодовой странице для окна консоли. Если вам известна кодовая страница, вы можете использовать MultiByteToWideChar для преобразования однобайтового или многобайтового ввода в UTF-16 (который в документации Windows называется Unicode). Оттуда вы можете конвертировать его в UTF-8 (с WideCharToMultiByte) или в любую другую кодировку Unicode, которую вы хотите.

Если у вас есть фокус, и вы приложение с графическим интерфейсом, вы можете увидеть нажатия клавиш с WM_KEYDOWN (и друзьями). Вы также можете получить полностью разрешенные символы UTF-16 с помощью WM_CHAR (или UTF-32 из WM_UNICHAR). Если вам нужен UTF-8 из них, вам нужно будет выполнить конвертацию.

1 голос
/ 04 мая 2010

Чтобы получить ввод с клавиатуры независимо от фокуса, вам, вероятно, потребуется подключить клавиатуру.

Взгляните на SetWindowsHookEx с WH_KEYBOARD или WH_KEYBOARD_LL. Добавьте W к вызову для варианта Unicode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...