我刚刚在我们的游戏中重新分配了一个热键,使用斜杠键" /",根据ASCII表的值应为47.但它没有触发。它会触发我所有其他标准键。当我单步执行代码时,如果我在数字键盘上使用斜杠,则会看到keyEventRecord将键值显示为191或111。为什么会这样?我需要以某种方式转换它吗?
为了澄清,我将键值存储为int。
答案 0 :(得分:5)
键盘对ASCII一无所知。他们只知道扫描代码,它们是实际密钥的供应商特定ID。
处理后,扫描代码会在独立于供应商的虚拟密钥代码中进行标准化。 191是VK_OEM_2
(用于美国键盘中的/?
键),111是VK_DIVIDE
。
当分派到UI窗口时,虚拟键码会转换为WM_CHAR
和WM_UNICHAR
消息中的字符代码。这些是人类可读的字符,例如ASCII字符(尽管WM_CHAR
实际上呈现ANSI / UTF-16编码的字符,而WM_UNICHAR
采用UTF-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)
*/
但是,对于其他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以获取更多信息: