我该如何使用Win32 API读取按键输入?我还想看到来自国际键盘(如德语umlauts)的输入。
谢谢
谢谢
键盘按键和它们生成的字符之间有区别。
在最低级别上,您可以使用GetKeyboardState
轮询键盘状态。这通常是键盘记录恶意软件的方式,因为它需要最少的特权并且无论焦点在哪里都可以看到所有内容。这种方法的问题(除了需要不断轮询)是您必须将键盘状态拼凑成按键,然后将按键拼凑成字符流。您必须知道键盘如何映射,您必须保持Shift键、Control键、Alt键等状态。您必须了解自动重复、死键和可能的其他复杂性。
如果您拥有特权,可以安装键盘钩子,就像Jens在他的答案中提到的那样。
如果你的应用程序有焦点且为控制台应用程序,则可以使用其中一个函数从标准输入读取。在Windows上,很难获得真正的Unicode输入。通常会得到所谓的ANSI字符,这些字符对应于控制台窗口的当前代码页。如果你知道代码页,可以使用MultiByteToWideChar
将单字节或多字节输入转换为UTF-16(Windows文档称之为Unicode)。然后,你可以将其转换为UTF-8(使用WideCharToMultiByte
)或任何其他Unicode编码。WM_KEYDOWN
(和相关函数)来查看按键。你还可以从WM_CHAR
(或WM_UNICHAR
获取完全解析的UTF-16字符。如果需要从中获取UTF-8,则必须进行转换。如果想要无论焦点在哪里都能获取键盘输入,您可能需要挂钩键盘。
可以查看使用 WH_KEYBOARD 或 WH_KEYBOARD_LL 的 SetWindowsHookEx。对于 Unicode 变体,请在调用中添加 W。
getwchar()
,如果是后者,请响应WM_UNICHAR
消息。另外请注意,"UTF8字符"这种说法并不存在:"字符"通常指的是"Unicode字符",但Windows文档使用这个术语来代替"UTF-16代码单元"。 - Philipp