检测C++中的WM_KEYUP和WM_KEYDOWN事件
Detecting WM_KEYUP and WM_KEYDOWN events in C++
我正在编写一个游戏,希望能够检测何时同时按下两个箭头键。
例如:
如果按下 UP 和 LEFT:我希望角色向西北
移动如果单独按下 UP:我希望角色向北
移动如果按下 UP 和 LEFT,现在释放 LEFT:我希望向西北移动的角色只开始向北移动。
我尝试使用 4 个布尔值来实现这一点,这些布尔值跟踪按下了哪个箭头键。
LRESULT CALLBACK WindowProc (HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
//Variables and stuff initialized
switch (msg)
{
case WM_CREATE:{//Stuff to initialize windows info}break;
case WM_COMMAND:{//Stuff that responds to menubar selections}break;
case WM_KEYDOWN:
{
switch(wParam)
{
case VK_UP:{moveUp=true;}break;
case VK_DOWN:{moveDown=true;}break;
case VK_LEFT:{moveLeft=true;}break;
case VK_RIGHT:{moveRight=true;}break;
//More cases for handling W,Q,A,S,D and SPACE inputs
default: //Stop moving character
}
}
//Make changes to player input over here
case WM_KEYUP:
{
switch(wParam)
{
//Cases for handling ESCAPE, P, R, W and SPACE inputs
case VK_UP:{moveUp=false;}break;
case VK_DOWN:{moveDown=false;}break;
case VK_LEFT: {moveLeft=false;}break;
case VK_RIGHT:{moveRight=false;}break;
}//end switch
}//end WM_KEYUP
break;
case WM_PAINT:{}break;
case WM_SIZE:{}break;
case WM_DESTROY:{}break;
}//end switch
return DefWindowProc (hwnd, msg, wParam, lParam);
}
而且它不起作用...向上移动,向下移动..如果我只是捕捉WM_KEYDOWN事件,就会设置布尔值......但是如果我使用WM_KEYDOWN代码使它们变假,则根本不会检测到它们。
不知道为什么会这样。在我的游戏中使用角色键进入特定模式时遇到同样的问题。只要按下"Q",我希望游戏处于特殊模式,并在发布时退出该模式。但即使这样也不起作用,就像这个箭头键的东西不起作用一样。
我在这里缺少什么吗?
我看到的直接问题是缺少case WM_KEYDOWN:
的break;
语句
这意味着每次case WM_KEYDOWN:
将 moveX 设置为 true 时case WM_KEYUP:
都会立即将其设置回 false。您说当您"只是捕获WM_KEYDOWN
事件"时,moveX 变量设置正确,这表明这确实是问题所在。注释掉case WM_KEYUP:
后,控制权将在中断之前流入case WM_PAINT:
(您可能不会注意到)。
也许 GetAsyncKeyState 函数对您有用。
相关文章:
- "WM" C++是什么意思?
- 什么是窗口最大化/最小化/恢复的WM Windows消息
- 请求X11在C或C++中合成WM的图像
- SDL 2 Space keydown未检测到,但Space keyup工作正常
- 删除密钥未触发 KeyUp 和 KeyDown 事件
- C++(煤渣):无法在 keyDown 函数中更新对象的属性
- Visual C++ Forms: Global Keydown
- 如何在C++中将keydown事件发送到非活动窗口
- 如果在WM/CE平台中用于卸载,DMProcessConfigXML将关闭正在运行的应用程序
- 在C或c++ (mac OSX)中有KeyDown事件
- 模拟跳跃与keyDown过剩c++不是100%
- VB.NET:未知的KeyDown事件问题
- UWP Windows 10 Direct3D 12 应用程序C++ KeyDown 延迟