You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:33:13