如何用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




