Существует разница между нажатиями клавиш и генерируемыми ими символами.
На самом низком уровне вы можете опрашивать состояние клавиатуры с помощью 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 из них, вам нужно будет выполнить конвертацию.