2010-05-01 62 views
4

如何读取使用win32 api的按键?我也想从国际键盘看到它们,比如德国变音器。C++ win32从键盘获取utf8字符

谢谢

+2

你说的是控制台应用程序还是GUI应用程序?在前一种情况下,在后一种情况下使用'getwchar()'来响应'WM_UNICHAR'消息。另外请注意,不存在“UTF8字符”这样的内容:“字符”通常表示“Unicode字符”,但Windows文档使用该术语而不是“UTF-16代码单元”。 – Philipp 2010-05-01 10:24:08

+0

实际上它应该抓住笔画,即使它没有焦点 – ehmmmm 2010-05-01 10:28:07

回答

1

要获得键盘输入而不管焦点,您可能需要钩住键盘。

请使用WH_KEYBOARD或WH_KEYBOARD_LL查看SetWindowsHookEx。将W添加到Unicode变体的调用中。

3

键盘按压和它们生成的字符之间存在差异。

在最低级别,您可以用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,则必须进行转换。