检测C++中的WM_KEYUP和WM_KEYDOWN事件

Detecting WM_KEYUP and WM_KEYDOWN events in C++

本文关键字:WM KEYDOWN 事件 KEYUP C++ 检测 中的      更新时间:2023-10-16

我正在编写一个游戏,希望能够检测何时同时按下两个箭头键。

例如:

如果按下 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 函数对您有用。