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字符的主要内容,如果未能解决你的问题,请参考以下文章

从键盘获取字符,字符大小写转换

C++编程,从键盘输入两个数组,求两个数组的交集并输出。

.NET下如何拦截鼠标、键盘消息?Win32NET来帮你

在控制台 C++ 中获取鼠标和键盘输入

.NET下如何拦截鼠标键盘消息?Win32NET来帮你

java程序获取键盘输入(转载)