为什么斜杠键"/"的ASCII值不是47?

Dav*_*nor 2 c++ ascii visual-studio-2010

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

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

Rem*_*eau 5

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

处理后,扫描代码将在与供应商无关的虚拟密钥代码中进行标准化.191是VK_OEM_2(用于/?美国键盘中的键),111是VK_DIVIDE.

当分派给UI窗口,虚拟键代码被转换成字符代码WM_CHARWM_UNICHAR的消息.这些是人类可读的字符,例如ASCII字符(尽管WM_CHAR实际上呈现ANSI/UTF-16编码和WM_UNICHARUTF-32编码的字符).

因此,您正在处理键盘事件,例如,WM_KEYDOWN/UP或者ReadConsoleInput(),当您需要字符代码时,它们会报告虚拟键代码.

对于许多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)
 */
Run Code Online (Sandbox Code Playgroud)

但是,对于其他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
Run Code Online (Sandbox Code Playgroud)

阅读MSDN以获取更多信息:

关于键盘输入