【问题标题】:How can I convert a vk constant to text?如何将 vk 常量转换为文本?
【发布时间】:2020-10-01 13:01:00
【问题描述】:

我正在尝试将 vk 常量(可能连接在一起)转换为它们的名称(例如,81 (VK_CONTROL|VK_SHIFT|VK_A) = “Control+Shift+A”。 我尝试使用 GetKeyNameText 函数(使用 vk 和 scancode 常量),但它似乎不起作用(字符串为空白,它返回 0,GetLastError 也返回 0)。

【问题讨论】:

    标签: c winapi


    【解决方案1】:

    据我所知,目前还没有直接将组合虚拟键转换为文本的 API 函数。对于非字符键(VK_CONTROLVK_SHIFT等),需要手动拼接字符串。

    对于字符键,MapVirtualKey 适合我。

    我测试了你提供的代码:

    UINT t = MapVirtualKey(VK_A, MAPVK_VK_TO_CHAR);
    

    我可以得到它的返回值:

    【讨论】:

    • 糟糕。我正在使用带有 GetKeyNameText 的 MapVirtualKey(VK_A, MAPVK_VK_TO_CHAR) 的返回,没有意识到我可以只转换为字符串。谢谢你的帮助。我仍然发现可能最艰巨的任务是尝试逐个获取它们,因为这需要检查所有 VK 代码并检查它们的位是否已设置。
    • @NSstudios 你能解释一下为什么你需要这样检查吗?如果只是判断按钮按下时的状态,似乎不需要一一判断。
    • 我正在尝试从快捷方式中读取热键字段并将键的数字表示形式转换为文本。对于热键 GUI 控件也很有用。
    • @NSstudios 您可以使用GetAsyncKeyState 来检查虚拟键的状态。
    • 谢谢,但这并不适合我的主要目标:读取快捷方式/lnk 文件,获取其热键字段,并将其键的数字表示转换为文本。我想我只需要遍历所有 vk 常量并一一找到它们。
    【解决方案2】:

    过滤掉控制和移位

    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'
    

    【讨论】:

    • 感谢您的回答。我希望为组合常量提供更多的自动解决方案,但即使我只做 VK_A 或使用 MapVirtualKey(VK_A, MAPVK_VK_TO_CHAR) 将 VK_A 映射到字符,我也无法让 GetKeyName 给我任何东西。它应该写入内容的缓冲区是空的,即使我确实告诉它是 1024 字节。
    • 编辑了如何使用 MapVirtualKey 以及清除控制和移位位
    猜你喜欢
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2019-11-26
    • 2023-03-03
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多