C# 如何在没有特殊选择的情况下获得WinC窗体中的按键

C# 如何在没有特殊选择的情况下获得WinC窗体中的按键,c#,winforms,visual-studio,C#,Winforms,Visual Studio,我有一个控制器,你可以通过鼠标点击来移动 我希望控制器也能通过按键和箭头键来移动 我得到的是: private void project1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Up) { MoveUp(); } if (e.KeyCode == Keys.Down) {

我有一个控制器,你可以通过鼠标点击来移动

我希望控制器也能通过按键和箭头键来移动

我得到的是:

    private void project1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Up)
        {
            MoveUp();
        }

        if (e.KeyCode == Keys.Down)
        {
            MoveDown();
        }

        if (e.KeyCode == Keys.Left)
        {
            MoveLeft();
        }

        if (e.KeyCode == Keys.Right)
        {
            MoveRight();
        }
    }

    private void project1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        switch (e.KeyCode)
        {
            case Keys.Down:
            case Keys.Up:
            case Keys.Left:
            case Keys.Right:
                e.IsInputKey = true;
                break;
        }
    }
MoveDirection方法工作正常,因为我按下鼠标按钮时它们是相同的

但我不能让它与箭头键一起工作-或者任何我也试过WASD的键,但它不工作-什么都没有发生

我做错了什么


很抱歉,如果这是一个无意义的问题,我仍在学习c:

您应该使用ProcessCmdKey重写方法来捕获箭头

在消息预处理期间调用此ProcessCmdKey以处理命令键,并且仅当控件托管在Windows窗体应用程序中时才调用此ProcessCmdKey

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    //capture up arrow key
    if (keyData == Keys.Up )
    {
        MessageBox.Show("You pressed Up arrow key");
        return true;
    }
    //capture down arrow key
    if (keyData == Keys.Down )
    {
        MessageBox.Show("You pressed Down arrow key");
        return true;
    }
    //capture left arrow key
    if (keyData == Keys.Left)
    {
        MessageBox.Show("You pressed Left arrow key");
        return true;
    }
    //capture right arrow key
    if (keyData == Keys.Right )
    {
        MessageBox.Show("You pressed Right arrow key");
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}
您需要将Form KeyPreview属性设置为true


建议使用KeyPreview属性为表单创建键盘处理过程。例如,当应用程序使用功能键时,将KeyPreview属性设置为True可使您在窗体级别处理击键,而不是为可能接收击键事件的每个控件编写代码。

这是父窗体还是控件实际获取事件?检查一下-如果要处理重复的按键操作(光标键一直按下),则应放弃KeyDown事件并保留PreviewKeyDown处理程序,该处理程序可以很好地处理快速/重复的按键操作。在您的开关块中,设置类似于本例的键。向下:向下移动;打破等。在具有焦点的控件上引发键盘事件。不太可能是[winforms]应用程序中的表单。改为重写ProcessCmdKey。或者让控件自己知道这些击键,重写它的IsInputKey方法,就像PreviewKeyDown一样,这样它就可以看到它们并执行它需要执行的操作。但是,只有当控制始终具有焦点时,这才起到预期的作用。对于WASD样式的控件,您肯定会喜欢ProcessCmdKey。