【问题标题】:Detecting WM_KEYUP and WM_KEYDOWN events in C++在 C++ 中检测 WM_KEYUP 和 WM_KEYDOWN 事件
【发布时间】:2012-04-12 16:48:33
【问题描述】:

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

例如:

如果按下 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 和布尔值...但是如果我使用 WM_KEYDOWN 代码使它们为假,它们根本不会被检测到.

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

我在这里缺少什么吗?

【问题讨论】:

  • 根本没有检测到它们是什么意思?您的 WM_KEYDOWN 处理程序只是设置静态/全局值,对吗?这不会影响 WndProc 是否接收消息。您遗漏了导致实际问题的代码。

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


【解决方案1】:

我看到的直接问题是 case WM_KEYDOWN: 缺少 break; 语句

这意味着每次case WM_KEYDOWN: 将 moveX 设置为 true case WM_KEYUP: 都会立即将其设置回 false。您说当您“仅捕获 WM_KEYDOWN 事件”时正确设置了 moveX 变量,这表明这确实是问题所在。注释掉case WM_KEYUP: 后,控制权将转而流入case WM_PAINT:(您可能不会注意到),然后再中断。

【讨论】:

    【解决方案2】:

    也许GetAsyncKeyState 函数对你有用。

    【讨论】:

      猜你喜欢
      • 2015-03-23
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多