簡體   English   中英

在 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 事件,則會設置 moveUp、moveDown.. 和 bools......但如果我使用 WM_KEYDOWN 代碼使它們成為假,它們根本不會被檢測到。

不知道為什么會這樣。 在我的游戲中使用字符鍵進入特定模式時遇到了同樣的問題。 只要按下“Q”,我就希望游戲處於特殊模式,並在發布時退出該模式。 但即使這樣也不起作用,就像這個箭頭鍵一樣不起作用。

有什么我在這里想念的嗎?

我看到的直接問題是缺少break; case WM_KEYDOWN:聲明case WM_KEYDOWN:

這意味着每次case WM_KEYDOWN:將 moveX 設置為 true case WM_KEYUP:立即將其設置回 false。 你說當你“只是捕捉WM_KEYDOWN事件”時,moveX 變量設置正確,這表明這確實是問題所在。 case WM_KEYUP:注釋掉后,控制將改為在中斷之前流入case WM_PAINT:您可能不會注意到)。

也許GetAsyncKeyState函數對您有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM