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

时间:2012-04-12 16:48:33

标签: c++ winapi user-interface user-input

我正在编写游戏,希望能够同时检测到两个箭头键的时间。

例如:

如果按下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事件,那么moveUp,moveDown ..和bools正在被设置......但是如果我使用WM_KEYDOWN代码使它们变为假,它们根本就没被检测到。

不知道为什么会这样。使用字符键在我的游戏中进入特定模式时遇到同样的问题。只要按下“Q”,我就希望游戏处于特殊模式,并在游戏发布时退出该模式。但即使这样也行不通,就像这个箭头键不起作用一样。

我在这里缺少什么吗?

2 个答案:

答案 0 :(得分:0)

也许GetAsyncKeyState函数对您有用。

答案 1 :(得分:0)

我看到的直接问题是break;

缺少case WM_KEYDOWN:声明

这意味着每次case WM_KEYDOWN:将moveX设置为true case WM_KEYUP:时,会立即将其设置为false。你说当你正在捕捉WM_KEYDOWN事件时,正确设置moveX变量"这表明这确实是个问题。在case WM_KEYUP:注释掉之后,控件将会在打破之前流入case WM_PAINT:(您可能不会注意到)。