C++ 如何处理WndProc中字符的向下键和向上键?
我正在尝试处理箭头键和C++ 如何处理WndProc中字符的向下键和向上键?,c++,c,winapi,wndproc,C++,C,Winapi,Wndproc,我正在尝试处理箭头键和A,W,S,D字符的向上键和向下键消息 我可以使用WM\u KEYUP和WM\u KEYDOWN处理箭头键的上下行为 但当我试图处理上述角色的上下行为时,它无法正常工作 我尝试了WM\u KEYUP和WM\u KEYDOWN来处理chracter。但是在我把它们改成WM\u CHAR和WM\u dedchar之后。但它仍然不起作用 对于字符,我可以处理前几个向下键和向上键的消息,但程序不能处理这些消息。 但对于箭头键,程序工作正常 我是新手,没有发现如何处理角色的上下行为
A
,W
,S
,D
字符的向上键和向下键消息
我可以使用WM\u KEYUP
和WM\u KEYDOWN
处理箭头键的上下行为
但当我试图处理上述角色的上下行为时,它无法正常工作
我尝试了WM\u KEYUP
和WM\u KEYDOWN
来处理chracter。但是在我把它们改成WM\u CHAR
和WM\u dedchar
之后。但它仍然不起作用
对于字符,我可以处理前几个向下键和向上键的消息,但程序不能处理这些消息。
但对于箭头键,程序工作正常
我是新手,没有发现如何处理角色的上下行为
下面是我尝试的最后一个代码(只是WndProc
函数)
start\u game()
是我的主要功能,我在该功能中使用键的上下消息
我的问题是,如何处理字符的向下键和向上键行为,例如A
,D
在我按下
A
或W
后,程序无法处理这些字符的上键行为以及任何其他字符的下键行为,如s
和D
。但同时程序可以处理箭头键的上下行为
根据:
WM_DEADCHAR
指定由死键生成的字符代码。死人
密钥是生成字符的密钥,如umlaut
(双点),与另一个字符组合形成一个
复合字符
因此,WM\u dedchar
消息不是您认为与WM\u CHAR
消息对应的消息
您还可以使用WM\u KEYDOWN
/WM\u keydup
消息来处理字符键:
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; }
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_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; }
if (RELEASED_KEY == 'A' or RELEASED_KEY == 'a') { players[1]->moves.left = false; }
else if (RELEASED_KEY == 'D' or RELEASED_KEY == 'd') { players[1]->moves.right = false; }
else if (RELEASED_KEY == 'W' or RELEASED_KEY == 'w') { players[1]->moves.up = false; }
else if (RELEASED_KEY == 'S' or RELEASED_KEY == 's') { players[1]->moves.down = false; }
break;
窗口上是否还有其他窗口,如可能窃取焦点的编辑框或按钮?我在本地运行一些东西,基本上使用您的代码,没有问题。我确实看到你的代码中有一部分使用了
players[1]
,另一部分使用了players[0]
,这是故意的吗?你能描述一下你期望的行为和实际的行为吗?@lapest不确定你期望在那里做什么,但是它肯定与WM\u KEYUP
没有关系,同样的WM\u CHAR
是WM\u KEYDOWN
@lapest,你有WM\u KEYDOWN/UP
来处理按键和释放,你有WM\u CHAR
来处理翻译字符。但没有“char up”的概念(或信息)。将一些printf
或其他日志添加到您的WndProc
,以更好地了解正在发生的事情。尝试此代码时,有时即使我释放角色,方向(代码中的player.move)也会受阻。因此,我必须再次按下并释放以保存它。@lapestand刚才代码中有一个错误。我在释放时使用了按键
。我已经修改了代码,你可以参考它。它很有效,谢谢!一个开关
比一堆if
s更有意义。但更重要的是,请注意WM|u键(向下|向上)
仅处理。字母A..Z的虚拟键代码在0x41..0x5A
范围内,这与ASCII中的大写字母相同,因此这些消息中的键代码永远不会是'A'/'d'/'w'/'s'
,而只会是A'/'d'/'w'/'s'
<另一方面,code>WM_CHAR处理文本字符,因此它将看到小写字母,如果用户实际键入的是小写字母的话。
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; }
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_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; }
if (RELEASED_KEY == 'A' or RELEASED_KEY == 'a') { players[1]->moves.left = false; }
else if (RELEASED_KEY == 'D' or RELEASED_KEY == 'd') { players[1]->moves.right = false; }
else if (RELEASED_KEY == 'W' or RELEASED_KEY == 'w') { players[1]->moves.up = false; }
else if (RELEASED_KEY == 'S' or RELEASED_KEY == 's') { players[1]->moves.down = false; }
break;