You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用GetAsyncKeyState检测~键?C++按键检测咨询

解决GetAsyncKeyState无法检测~键的问题

哦这个问题我之前做Windows程序开发时也踩过坑!其实GetAsyncKeyState完全可以检测到键盘左上角的键,核心问题是你用错了对应的虚拟键码——这个和`共享的按键,对应的Windows虚拟键码不是字符`'',而是预定义的VK_OEM_3(在winuser.h`中定义,数值为0xC0)。

直接可用的测试代码

你可以用下面的代码快速验证,它会循环检测~键的按下状态:

#include <windows.h>
#include <iostream>

int main() {
    std::cout << "按下~键测试,按ESC退出程序" << std::endl;
    while (true) {
        // 关键:用VK_OEM_3作为参数,且与0x8000做按位与判断按下状态
        if (GetAsyncKeyState(VK_OEM_3) & 0x8000) {
            std::cout << "~键被按下啦!" << std::endl;
            Sleep(200); // 加小延迟避免短时间内重复输出
        }
        // ESC键触发退出
        if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) {
            break;
        }
    }
    return 0;
}

几个必须注意的细节

  • 一定要包含windows.h头文件,VK_OEM_3这个宏是在这里定义的,否则编译器会报“未定义标识符”的错误。
  • GetAsyncKeyState的返回值不能直接用“非零即按下”来判断,必须和0x8000做按位与运算——这个值对应返回值的最高位,只有该位为1时,才代表按键当前处于按下状态。
  • 如果你的键盘是非美式布局(比如部分欧洲键盘),VK_OEM_3可能对应其他按键,这种情况下可以用MapVirtualKey配合扫描码确认,但绝大多数常规场景下VK_OEM_3就是对应左上角的~键。

窗口程序中的替代方案

要是你在写带窗口的GUI程序,也可以通过处理窗口消息来检测该按键:

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        case WM_KEYDOWN:
            if (wParam == VK_OEM_3) {
                MessageBox(hwnd, L"~键被按下", L"提示", MB_OK);
            }
            break;
        // 其他消息处理逻辑...
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

内容的提问来源于stack exchange,提问作者nabangkae

火山引擎 最新活动