Dav*_*nor 2 c++ ascii visual-studio-2010
我刚刚在我们的游戏中重新分配了一个热键,使用斜杠键"/",根据ASCII表,它应该具有值47.但它不会触发.它会触发我所有其他标准键.当我单步执行代码时,如果我在数字键盘上使用斜杠,则会看到keyEventRecord将键值显示为191或111.为什么会这样?我需要以某种方式转换它吗?
为了澄清,我将键值存储为int.
键盘对ASCII一无所知.他们只知道扫描代码,这些代码是实际密钥的供应商特定ID.
处理后,扫描代码将在与供应商无关的虚拟密钥代码中进行标准化.191是VK_OEM_2(用于/?美国键盘中的键),111是VK_DIVIDE.
当分派给UI窗口,虚拟键代码被转换成字符代码中WM_CHAR和WM_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以获取更多信息: