【问题标题】:Why does the slash key "/" not have an ASCII value of 47?为什么斜线键“/”的 ASCII 值不是 47?
【发布时间】:2015-04-23 00:33:17
【问题描述】:

我刚刚在我们的游戏中重新分配了一个热键来使用斜线键“/”,根据 ASCII 表,它的值应该是 47。但它没有触发。它为我所有的其他标准键触发。当我单步执行代码时,如果我在数字键盘上使用斜杠,我看到 keyEventRecord 将键值显示为 191 或 111。为什么会这样?我需要以某种方式转换它吗?

为了清楚起见,我将键值存储为 int。

【问题讨论】:

  • 你能在另一台电脑上复制这个错误吗?
  • 你是不是混淆了按键扫描码和字符码?
  • 阅读一些文档,那些是virtual-key codes,而不是ASCII。

标签: c++ visual-studio-2010 ascii


【解决方案1】:

键盘对 ASCII 一无所知。他们只知道扫描码,这是实际密钥的供应商特定 ID。

处理后,扫描代码会在独立于供应商的虚拟键代码中标准化。 191 是VK_OEM_2(用于美国键盘中的/? 键),111 是VK_DIVIDE

当发送到 UI 窗口时,虚拟键代码在WM_CHARWM_UNICHAR 消息中转换为字符代码。这些是人类可读的字符,例如 ASCII 字符(尽管 WM_CHAR 实际上以 ANSI/UTF-16 编码呈现字符,而 WM_UNICHAR 以 UTF-32 编码呈现字符)。

因此,您显然是在处理键盘事件,例如 WM_KEYDOWN/UPReadConsoleInput(),它们在您期望 字符代码 时报告虚拟键代码

对于很多ASCII字符来说,它们的虚拟键码和它们的字符码是相同的值,例如:

#define VK_BACK           0x08
#define VK_TAB            0x09
#define VK_RETURN         0x0D
#define VK_SPACE          0x20

/*
 * VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39)
 * VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A)
 */

但是,对于其他 ASCII 字符,它们的虚拟键码和它们的字符码有不同的值,例如:

#define VK_OEM_1          0xBA   // ';:' for US
#define VK_OEM_PLUS       0xBB   // '+' any country
#define VK_OEM_COMMA      0xBC   // ',' any country
#define VK_OEM_MINUS      0xBD   // '-' any country
#define VK_OEM_PERIOD     0xBE   // '.' any country
#define VK_OEM_2          0xBF   // '/?' for US
#define VK_OEM_3          0xC0   // '`~' for US
#define VK_OEM_4          0xDB  //  '[{' for US
#define VK_OEM_5          0xDC  //  '\|' for US
#define VK_OEM_6          0xDD  //  ']}' for US
#define VK_OEM_7          0xDE  //  ''"' for US

阅读 MSDN 了解更多信息:

About Keyboard Input

【讨论】:

  • 谢谢。这段代码最初是由一位同事编写的,我现在可以看到他在哪里处理您所指出的异常(例如 VK_OEM_3) 他没有为斜线添加一个。我现在就这样做。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 2013-01-21
  • 2020-03-22
  • 1970-01-01
  • 2012-10-07
  • 2019-01-28
  • 1970-01-01
相关资源
最近更新 更多