Visual C++中GetAsyncKeyState标识符未定义错误解决求助
解决GetAsyncKeyState标识符找不到的问题
嘿,作为刚接触C++、DirectX和Windows编程的新手,碰到这个问题太正常了,我帮你一步步排查解决:
先搞定最可能的命名空间冲突问题
你已经引入了using namespace Windows;,这个命名空间属于WinRT框架,而GetAsyncKeyState是原生Win32 API的全局函数,有时候编译器会因为命名空间的优先级问题找不到它。解决方法很简单,在函数名前加上全局命名空间标识符::,明确告诉编译器调用全局的Win32函数:
return (::GetAsyncKeyState(key) & 0x8000) != 0;
另外要注意!你原来的代码括号位置有逻辑错误:&的优先级比!=低,原来的表达式会被解析成GetAsyncKeyState(key) & (0x8000 != 0),完全不是你想要的判断逻辑,上面的代码也顺便修正了这个问题。
如果还是不行,检查头文件和编译宏
- 虽然你已经包含了
Windows.h,但如果项目里默认开启了WIN32_LEAN_AND_MEAN宏(很多DirectX项目会用这个来减少编译时间),可能会隐藏部分Win32 API。你可以尝试在包含Windows.h前取消这个宏定义,或者手动添加winuser.h(GetAsyncKeyState的实际声明头文件):
#undef WIN32_LEAN_AND_MEAN #include <Windows.h> // 或者额外添加 #include <winuser.h>
特殊情况:如果你是UWP项目
如果你的项目是UWP(通用Windows平台)应用,原生Win32的GetAsyncKeyState是被禁用的,这时候得用UWP专属的API来获取键盘状态,比如借助CoreWindow的方法:
CoreWindow^ window = CoreWindow::GetForCurrentThread(); VirtualKeyStates state = window->GetKeyState(static_cast<VirtualKey>(key)); return (state & VirtualKeyStates::Down) != 0;
按照上面的步骤试一下,应该能解决你的问题!
内容的提问来源于stack exchange,提问作者Josh




