【发布时间】:2021-05-12 16:14:52
【问题描述】:
我正在尝试处理箭头键和A、W、S、D 字符的向上和向下键消息。
我可以使用WM_KEYUP和WM_KEYDOWN处理箭头键的向上和向下行为。
但是当我尝试处理上述字符的上下行为时,它无法正常工作。
我试过WM_KEYUP和WM_KEYDOWN来处理字符。但是在我将它们更改为WM_CHAR 和WM_DEADCHAR 之后。但是还是不行。
对于字符我可以处理前几个按键向下和向上消息,然后程序不处理这些。 但是对于方向键,程序可以正常运行。
我是新手,不知道如何处理角色的上下行为。
下面是我试过的最后一个代码(只是WndProc函数)。
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg)
{
case WM_CREATE:
Hmainbmp = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE | SS_BITMAP | WS_THICKFRAME, 1, 23, WINDOW_WIDTH, WINDOW_HEIGHT, hWnd, nullptr, hInst, nullptr);
start_game();
break;
case WM_CHAR:
PRESSED_KEY = (int)wParam;
if (PRESSED_KEY == 'A' or PRESSED_KEY == 'a') { players[1]->moves.left = true; }
else if (PRESSED_KEY == 'D' or PRESSED_KEY == 'd') { players[1]->moves.right = true; }
else if (PRESSED_KEY == 'W' or PRESSED_KEY == 'w') { players[1]->moves.up = true; }
else if (PRESSED_KEY == 'S' or PRESSED_KEY == 's') { players[1]->moves.down = true; }
break;
case WM_DEADCHAR:
PRESSED_KEY = (int)wParam;
if (PRESSED_KEY == 'A' or PRESSED_KEY == 'a') { players[1]->moves.left = false; }
else if (PRESSED_KEY == 'D' or PRESSED_KEY == 'd') { players[1]->moves.right = false; }
else if (PRESSED_KEY == 'W' or PRESSED_KEY == 'w') { players[1]->moves.up = false; }
else if (PRESSED_KEY == 'S' or PRESSED_KEY == 's') { players[1]->moves.down = false; }
break;
case WM_KEYDOWN:
PRESSED_KEY = (int)wParam;
if (PRESSED_KEY == VK_LEFT) { players[0]->moves.left = true; }
else if (PRESSED_KEY == VK_RIGHT) { players[0]->moves.right = true; }
else if (PRESSED_KEY == VK_UP) { players[0]->moves.up = true; }
else if (PRESSED_KEY == VK_DOWN) { players[0]->moves.down = true; }
break;
case WM_KEYUP:
RELEASED_KEY = (int)wParam;
if (RELEASED_KEY == VK_LEFT) { players[0]->moves.left = false; }
else if (RELEASED_KEY == VK_RIGHT) { players[0]->moves.right = false; }
else if (RELEASED_KEY == VK_UP) { players[0]->moves.up = false; }
else if (RELEASED_KEY == VK_DOWN) { players[0]->moves.down = false; }
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, uMsg, wParam, lParam));
}
return(0L);
}
start_game() 是我的主要功能,我在该功能中使用键的向上和向下消息。
我的问题是,如何处理 A、D 等字符的按键和按键行为?
在我按下A 或W 后,程序无法处理这些字符的按键行为以及任何其他字符的按键行为,例如S 和D。但同时程序可以处理方向键的上下行为。
【问题讨论】:
-
窗口上是否还有另一个窗口,例如可能窃取了焦点的编辑框或按钮?
-
我在这里本地运行一些东西,基本上使用你的代码,没有任何问题。我确实看到您的部分代码使用
players[1]而另一部分使用players[0]这是故意的吗? -
与其重复一个模糊的“不起作用”,您能描述一下您期望的行为和实际行为吗?
-
@lapestand 不确定您期望
WM_DEADCHAR在那里做什么,但它肯定与WM_KEYUP无关,就像WM_CHAR与WM_KEYDOWN一样。 -
@lapestand 你有
WM_KEYDOWN/UP来处理按下和释放的键,你有WM_CHAR来处理翻译的字符。但是没有“char up”的概念(或消息)。将一些printf或其他日志添加到您的WndProc,以便更好地了解正在发生的事情。