向上,向下,向左和向右箭头键不会触发KeyDown事件

Mar*_*lle 67 c# keydown winforms

我正在构建一个应用程序,其中所有键输入必须由Windows本身处理.

我为每个控件设置了tabstop为false,除了一个面板之外,女巫可以抓住焦点(但我不知道它是否有效).

我将KeyPreview设置为true,我正在处理此窗体上的KeyDown事件.

我的问题是,有时箭头键不再响应:

  • 当我只按箭头键时,不会触发keydown事件.

  • 如果我按下带有控件修饰符的箭头键,则会触发keydown事件.

你知道我的箭头键突然停止发射事件的原因吗?

Rod*_*ber 61

我遇到了完全相同的问题.我考虑了@Snarfblam提供的答案; 但是,如果您阅读MSDN上的文档,则ProcessCMDKey方法将覆盖应用程序中菜单项的关键事件.

我最近偶然发现了微软的这篇文章,看起来非常有前途:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown.aspx.据微软称,做的最好的事情是设置e.IsInputKey=true;PreviewKeyDown检测方向键后事件.这样做会触发KeyDown事件.

这对我来说效果很好,并且比重写ProcessCMDKey要少得多.

  • 这应该是选择的答案,它更干净,而且效果很好。 (2认同)
  • (如果在没有检测到箭头的情况下对所有键执行此操作会怎样?) (2认同)

小智 57

    protected override bool IsInputKey(Keys keyData)
    {
        switch (keyData)
        {
            case Keys.Right:
            case Keys.Left:
            case Keys.Up:
            case Keys.Down:
                return true;
            case Keys.Shift | Keys.Right:
            case Keys.Shift | Keys.Left:
            case Keys.Shift | Keys.Up:
            case Keys.Shift | Keys.Down:
                return true;
        }
        return base.IsInputKey(keyData);
    }
    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        switch (e.KeyCode)
        {
            case Keys.Left:
            case Keys.Right:
            case Keys.Up:
            case Keys.Down:
                if (e.Shift)
                {

                }
                else
                {
                }
                break;                
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是一个黑客.检查Rodolfo Neuber的答案是否正确答案. (3认同)
  • 请注意,控件的所有制表位都应该是假的。(我遇到了这样的问题:D) (2认同)

sna*_*arf 16

请参阅Rodolfo Neuber的回复以获得最佳答案


(我原来的答案):

从控件类派生,您可以覆盖ProcessCmdKey方法.Microsoft选择从KeyDown事件中省略这些键,因为它们影响多个控件并移动焦点,但这使得应用程序很难以任何其他方式对这些键做出反应.

  • 这个答案是错误的.如果我还没有从已经处理了箭头键的一些基本控件中覆盖OnKeyDown(以改变行为),我就不会知道这一点,并且很难实现它.请参阅下面的alpha答案. (4认同)

Mar*_*cel 16

我正在使用PreviewKeyDown

    private void _calendar_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e){
        switch (e.KeyCode){
            case Keys.Down:
            case Keys.Right:
                //action
                break;
            case Keys.Up:
            case Keys.Left:
                //action
                break;
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 为我工作精美,无需继承/覆盖 (2认同)