Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理多个按键并检测按键事件_C#_Winforms_Keyboard_Keydown_Keyup - Fatal编程技术网

C# 处理多个按键并检测按键事件

C# 处理多个按键并检测按键事件,c#,winforms,keyboard,keydown,keyup,C#,Winforms,Keyboard,Keydown,Keyup,我正在制作一个简单的游戏,我使用以下代码来检测光标键: protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (Connection == null || Connection.IsOpen == false) return true; Thread.Sleep(SleepTime); switch (keyData) { case K

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

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();
}
我现在有两个问题:我想添加一种情况,用户可以同时按下向上和向右光标,这样字符就可以向右上移动。如何在代码中检查此条件

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

我的第二个问题是,
MainForm\u KeyUp
有时无法检测到按键释放,角色一直朝着这个方向移动


任何提示/帮助都将被告知

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

case Keys.Up & Keys.Right:
    ...
    break;
您还可以使用以下检查来检查单个密钥:

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

今天我们联系到了这个答案,这个答案完全错了。是的,枚举用
[FlagsAttribute]
标记,但这仅适用于修改器键。Up的值为38,Right的值为39,显然这些不是位标志。修改器键的位值足够高,不会与其他任何内容冲突,但所有非修改器键都没有不同的位掩码。