C# 覆盖Windows会形成某些关键事件的默认行为

C# 覆盖Windows会形成某些关键事件的默认行为,c#,.net,winforms,C#,.net,Winforms,我用一个简单的游戏创建了一个表单。游戏需要从箭头键等输入,但我在表单上放置的几个按钮正在窃取这些关键事件 据我所知,这是任何Windows窗体应用程序的默认行为,以便用户能够在各种控件之间更改焦点 我的问题是,如何绕过这个问题并确保可以使用这些键的输入?覆盖表单的OnKeyDown方法。不要忘记在最后调用base.OnKeyDown。您可以覆盖Form.ProcessCmdKey方法,以便能够处理用户的每次按键操作 protected override bool ProcessCmdKey(re

我用一个简单的游戏创建了一个
表单
。游戏需要从箭头键等输入,但我在表单上放置的几个按钮正在窃取这些关键事件

据我所知,这是任何Windows窗体应用程序的默认行为,以便用户能够在各种控件之间更改焦点


我的问题是,如何绕过这个问题并确保可以使用这些键的输入?

覆盖表单的OnKeyDown方法。不要忘记在最后调用base.OnKeyDown。

您可以覆盖
Form.ProcessCmdKey
方法,以便能够处理用户的每次按键操作

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.Down || keyData == Keys.Up)
    {
        // Process keys

        return true;
    }

    return base.ProcessCmdKey(ref msg, keyData);
}

返回
true
表示不应执行进一步的处理,并且键的默认行为不会产生任何影响。例如,您将无法再使用TAB键在控件之间移动焦点,因此您可能只应为仅由游戏处理的按键返回true。

我如何使用此方法处理按键的向下和向上事件?哇,我不清楚。我指的是OnKeyDown和OnKeyUp事件,而不是箭头键。@如果我误读了您的评论,您将无法使用
ProcessCmdKey
区分按键向下和按键向上。如果您有此要求,请查看
Application.AddMessageFilter