【发布时间】:2020-10-01 13:01:00
【问题描述】:
我正在尝试将 vk 常量(可能连接在一起)转换为它们的名称(例如,81 (VK_CONTROL|VK_SHIFT|VK_A) = “Control+Shift+A”。 我尝试使用 GetKeyNameText 函数(使用 vk 和 scancode 常量),但它似乎不起作用(字符串为空白,它返回 0,GetLastError 也返回 0)。
【问题讨论】:
我正在尝试将 vk 常量(可能连接在一起)转换为它们的名称(例如,81 (VK_CONTROL|VK_SHIFT|VK_A) = “Control+Shift+A”。 我尝试使用 GetKeyNameText 函数(使用 vk 和 scancode 常量),但它似乎不起作用(字符串为空白,它返回 0,GetLastError 也返回 0)。
【问题讨论】:
据我所知,目前还没有直接将组合虚拟键转换为文本的 API 函数。对于非字符键(VK_CONTROL、VK_SHIFT等),需要手动拼接字符串。
对于字符键,MapVirtualKey 适合我。
我测试了你提供的代码:
UINT t = MapVirtualKey(VK_A, MAPVK_VK_TO_CHAR);
我可以得到它的返回值:
【讨论】:
过滤掉控制和移位
char keybuff[64] = {0};
if (keys & VK_CONTROL) {
strcat(keybuff, "Control+");
keys &= ~VK_CONTROL; // turn bits OFF
}
if (keys & VK_SHIFT) {
strcat(keybuff, "Shift+");
keys &= ~VK_SHIFT;
}
并使用MapVirtualKey将VK码映射到一个字符
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-mapvirtualkeya
因此在以下情况下,key 变为 65,这是大写“A”的 ascii 值。把它转换成一个字符,你就有了这封信。这适用于 ascii 127 以下的所有代码。
UINT key = MapVirtualKey(VK_A, MAPVK_VK_TO_CHAR);
char c = (char)key; // 'A'
【讨论】: