基于Windows Hooks实现vkCode转虚拟键常量名称的极简方案问询
实现虚拟键码到常量名称的反向映射(精简版)
核心思路
抛弃冗余的switch-case分支,用静态键值对数组存储虚拟键码与对应常量名的映射关系,通过直接匹配完成查询,代码更紧凑且易于维护。
精简实现代码
以下是适配Windows虚拟键码的极简C++实现:
#include <Windows.h> const struct VkMap { UINT vkCode; const char* name; } vkConstMap[] = { {0x08, "$VK_BACK"}, {0x09, "$VK_TAB"}, {0x0D, "$VK_RETURN"}, {0x10, "$VK_SHIFT"}, {0x11, "$VK_CONTROL"}, {0x12, "$VK_MENU"}, {0x20, "$VK_SPACE"}, {0x2E, "$VK_DELETE"}, {0x70, "$VK_F1"}, {0x71, "$VK_F2"} // 按需补充其他虚拟键码,参考官方定义的完整列表 }; const char* vkConstName(UINT vkCode) { for (const auto& entry : vkConstMap) { if (entry.vkCode == vkCode) return entry.name; } return "$VK_UNKNOWN"; }
效率优化方案
如果需要高频查询,可将数组按vkCode排序后改用二分查找,提升匹配速度:
#include <algorithm> const char* vkConstName(UINT vkCode) { auto it = std::lower_bound(std::begin(vkConstMap), std::end(vkConstMap), vkCode, [](const VkMap& entry, UINT code) { return entry.vkCode < code; }); return (it != std::end(vkConstMap) && it->vkCode == vkCode) ? it->name : "$VK_UNKNOWN"; }
注意事项
- 常量名保持你要求的
$VK_XXX格式,可根据需求调整前缀或大小写 - 未匹配的虚拟键码返回
$VK_UNKNOWN,可根据业务逻辑修改默认返回值
内容的提问来源于stack exchange,提问作者lonmon
相关产品推荐
相关产品推荐

