c++ win32从键盘获取utf8字符
Posted
技术标签:
【中文标题】c++ win32从键盘获取utf8字符【英文标题】:c++ win32 get utf8 char from keyboard 【发布时间】:2010-05-01 10:18:42 【问题描述】:如何使用 win32 api 读取击键?我也想从德国变音符号等国际键盘上看到它们。
谢谢
【问题讨论】:
您说的是控制台应用程序还是 GUI 应用程序?前一种情况,使用getwchar()
,后一种情况,回复WM_UNICHAR
消息。另请注意,没有“UTF8 字符”之类的东西:“字符”通常表示“Unicode 字符”,但 Windows 文档使用该术语而不是“UTF-16 代码单元”。
其实它应该捕捉到笔画,即使它没有焦点
【参考方案1】:
键盘按下和它们生成的字符之间存在差异。
在最低级别,您可以使用GetKeyboardState
轮询键盘状态。这通常是键盘记录恶意软件的做法,因为它需要最少的权限并且无论焦点在哪里都能看到所有内容。这种方法的问题(除了需要不断轮询)是您必须将键盘状态拼凑成击键,然后将击键组合成字符流。您必须知道键盘是如何映射的,您必须保持 shift 键、控制键、alt 键等的状态。您必须了解自动重复、死键以及可能的其他并发症。
如果您有权限,您可以安装键盘挂钩,正如 Jens 在他的回答中提到的那样。
如果您有焦点,并且您是一个控制台应用程序,您可以使用其中一个函数从标准输入中读取。在 Windows 上,很难获得真正的 Unicode 输入。您通常会得到所谓的 ANSI 字符,它们对应于控制台窗口的当前代码页。如果您知道代码页,则可以使用MultiByteToWideChar
将单字节或多字节输入转换为 UTF-16(Windows 文档称为 Unicode)。从那里您可以将其转换为 UTF-8(使用 WideCharToMultiByte
)或您想要的任何其他 Unicode 编码。
如果您有焦点,并且您是一个 GUI 应用程序,您可以看到带有WM_KEYDOWN
(和朋友)的击键。您还可以使用WM_CHAR
(或WM_UNICHAR
的UTF-32)获得完全解析的UTF-16 字符。如果您需要其中的 UTF-8,则必须进行转换。
【讨论】:
【参考方案2】:要获得键盘输入而不考虑焦点,您可能需要挂钩键盘。
使用 WH_KEYBOARD 或 WH_KEYBOARD_LL 查看SetWindowsHookEx。在 Unicode 变体的调用中添加 W。
【讨论】:
以上是关于c++ win32从键盘获取utf8字符的主要内容,如果未能解决你的问题,请参考以下文章