[英]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.