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;