C++ Win32如何从键盘获取UTF-8字符

5
我该如何使用Win32 API读取按键输入?我还想看到来自国际键盘(如德语umlauts)的输入。

谢谢


2
你是在谈论控制台应用程序还是GUI应用程序?如果是前者,请使用getwchar(),如果是后者,请响应WM_UNICHAR消息。另外请注意,"UTF8字符"这种说法并不存在:"字符"通常指的是"Unicode字符",但Windows文档使用这个术语来代替"UTF-16代码单元"。 - Philipp
实际上,即使它没有焦点,它也应该捕捉到按键。 - ehmmmm
2个回答

4

键盘按键和它们生成的字符之间有区别。

在最低级别上,您可以使用GetKeyboardState轮询键盘状态。这通常是键盘记录恶意软件的方式,因为它需要最少的特权并且无论焦点在哪里都可以看到所有内容。这种方法的问题(除了需要不断轮询)是您必须将键盘状态拼凑成按键,然后将按键拼凑成字符流。您必须知道键盘如何映射,您必须保持Shift键、Control键、Alt键等状态。您必须了解自动重复、死键和可能的其他复杂性。

如果您拥有特权,可以安装键盘钩子,就像Jens在他的答案中提到的那样。

如果你的应用程序有焦点且为控制台应用程序,则可以使用其中一个函数从标准输入读取。在Windows上,很难获得真正的Unicode输入。通常会得到所谓的ANSI字符,这些字符对应于控制台窗口的当前代码页。如果你知道代码页,可以使用MultiByteToWideChar将单字节或多字节输入转换为UTF-16(Windows文档称之为Unicode)。然后,你可以将其转换为UTF-8(使用WideCharToMultiByte)或任何其他Unicode编码。
如果你的应用程序是GUI类型并具有焦点,你可以使用WM_KEYDOWN(和相关函数)来查看按键。你还可以从WM_CHAR(或WM_UNICHAR获取完全解析的UTF-16字符。如果需要从中获取UTF-8,则必须进行转换。

1

如果想要无论焦点在哪里都能获取键盘输入,您可能需要挂钩键盘。

可以查看使用 WH_KEYBOARD 或 WH_KEYBOARD_LL 的 SetWindowsHookEx。对于 Unicode 变体,请在调用中添加 W。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接