处理多个按键并检测键盘事件

我正在制作一个简单的游戏,我使用以下代码来检测光标键:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (Connection == null || Connection.IsOpen == false) return true; Thread.Sleep(SleepTime); switch (keyData) { case Keys.Up: GoForward(); return true; case Keys.Right: GoRight(); return true; case Keys.Left: GoLeft(); return true; case Keys.Down: GoBackward(); return true; case Keys.Space: Beep(); return true; } return base.ProcessCmdKey(ref msg, keyData); } 

我还使用此代码来确定用户是否已发布以前预设的密钥:

 private void MainForm_KeyUp(object sender, KeyEventArgs e) { StopRoomba(); } 

我现在有两个问题:我想添加一个用户可以同时按下UP和RIGHT游标的情况,这样角色就会向上移动。 如何在我的代码中检查这种情况?

也有一些奇怪的事情发生(或者它可能是一个默认系统)。 我可以一次按下3个光标键,或者例如我按住向上键,然后在按住向上的同时按住向右键,同时按住向上和向右按住向下键,我的代码对所有三个代码作出反应。 在下面的图片中,您可以看到红色方向已被按下并被我的代码检测到(红色=按下):

在此处输入图像描述

我的第二个问题是MainForm_KeyUp 有时不检测键释放,并且角色继续朝着方向前进。

任何提示/帮助都将受到关注

Keys是一个标记的枚举。 这意味着您可以使用按位比较来查看是否同时按下了多个键。

 case Keys.Up & Keys.Right: ... break; 

您还可以使用以下检查检查单个密钥:

 if ((keyData & Keys.Up) == Keys.Up) GoForward(); if ((keyData & Keys.Right) == Keys.Right) GoRight();