C++ win32从键盘获取utf8字符
答
键盘按压和它们生成的字符之间存在差异。
在最低级别,您可以用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,则必须进行转换。
你说的是控制台应用程序还是GUI应用程序?在前一种情况下,在后一种情况下使用'getwchar()'来响应'WM_UNICHAR'消息。另外请注意,不存在“UTF8字符”这样的内容:“字符”通常表示“Unicode字符”,但Windows文档使用该术语而不是“UTF-16代码单元”。 – Philipp 2010-05-01 10:24:08
实际上它应该抓住笔画,即使它没有焦点 – ehmmmm 2010-05-01 10:28:07