为什么斜杠键" /"没有ASCII值47?

时间:2015-04-23 00:33:17

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

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

为了澄清,我将键值存储为int。

1 个答案:

答案 0 :(得分:5)

键盘对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