【问题标题】:c++ win32 get utf8 char from keyboardc++ win32从键盘获取utf8字符
【发布时间】:2010-05-01 10:18:42
【问题描述】:

如何使用 win32 api 读取击键?我也想从德国变音符号等国际键盘上看到它们。

谢谢

【问题讨论】:

  • 您说的是控制台应用程序还是 GUI 应用程序?前一种情况,使用getwchar(),后一种情况,回复WM_UNICHAR消息。另请注意,没有“UTF8 字符”之类的东西:“字符”通常表示“Unicode 字符”,但 Windows 文档使用该术语而不是“UTF-16 代码单元”。
  • 其实它应该捕捉到笔画,即使它没有焦点

标签: c++ unicode winapi keyboard-events


【解决方案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。

    【讨论】:

      猜你喜欢
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      相关资源
      最近更新 更多