C# 如何防止usercontrol表单在c中处理键盘输入(箭头键)#

C# 如何防止usercontrol表单在c中处理键盘输入(箭头键)#,c#,.net,winforms,user-controls,keyboard,C#,.net,Winforms,User Controls,Keyboard,我的usercontrol包含可以选择的其他控件,我想实现使用箭头键在子控件上导航的方法 问题是父控件截取箭头键并使用它来滚动视图我想避免的事情是什么。我想解决自己导航控制内容的问题 我如何控制由箭头键引起的标准行为 提前谢谢 MTH这通常是通过重写IsInputKey()方法来完成的,告诉您需要这些键。但是,这对UserControl不起作用,它永远不会获得焦点,因此OnKeyDown方法永远不会运行。相反,重写ProcessCmdKey()方法,在窗体看到击键之前调用它。像这样: p

我的usercontrol包含可以选择的其他控件,我想实现使用箭头键在子控件上导航的方法

问题是父控件截取箭头键并使用它来滚动视图我想避免的事情是什么。我想解决自己导航控制内容的问题

我如何控制由箭头键引起的标准行为

提前谢谢
MTH

这通常是通过重写IsInputKey()方法来完成的,告诉您需要这些键。但是,这对UserControl不起作用,它永远不会获得焦点,因此OnKeyDown方法永远不会运行。相反,重写ProcessCmdKey()方法,在窗体看到击键之前调用它。像这样:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        switch (keyData) {
            case Keys.Left: MessageBox.Show("Left!"); break;
            case Keys.Right: MessageBox.Show("Right!"); break;
            default: return base.ProcessCmdKey(ref msg, keyData);
        }
        return true;  // used
    }

您可以在用户控件中覆盖OnKeyDown,但这对箭头键不起作用,因为它们不是“输入键”(它们是导航键)

要更改行为,请重写IsInputKey(),告知系统您希望获取箭头键的事件:

    protected override bool IsInputKey(Keys keyData)
    {
        bool result = false;

        Keys key = keyData & Keys.KeyCode;

        switch (key)
        {
            case Keys.Up:
            case Keys.Down:
            case Keys.Right:
            case Keys.Left:
                result = true;
                break;

            default:
                result = base.IsInputKey(keyData);
                break;
        }

        return result;
    }

向前按键或者在主机面板上设置一些属性来忽略事件。参见Hans Passant的答案-这也可以。IsInputKey在UserControls中运行良好(刚刚测试了上面的示例),虽然这两个答案都解决了问题,但在ProcessCmdKey上使用覆盖似乎更正确,无论如何,谢谢!