上,下,左,右箭头键不会触发KeyDown事件(Up, Down, Left and Right a

2019-09-02 10:21发布

我建立,所有的按键输入必须由Windows本身进行处理的应用程序。

我设置的制表位为false,每个控制女巫可以抓住除了面板对焦(但我不知道是否有效果)。

我设置的KeyPreview为真,我处理这种形式的KeyDown事件。

我的问题是,有时箭头键都没有反应了:

  • 当我只按箭头键不触发KeyDown事件。

  • 如果我按与控制修改的方向键keydown事件被触发。

你有一个想法,为什么我的箭头键突然停止射击的事件吗?

Answer 1:

    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;                
        }
    }


Answer 2:

我有完全相同的问题。 我认为@Snarfblam给出了答案; 但是,如果你看过MSDN上的文档,给ProcessCmdKey方法是为了覆盖在应用程序中的菜单项关键事件。

:我最近碰到这篇文章来自微软,它看起来很有希望跌跌撞撞http://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown.aspx 。 据微软称,做的最好的事情是设置e.IsInputKey=true;PreviewKeyDown检测箭头键后事件。 否则,将触发KeyDown事件。

这个工作很适合我,是不是覆盖给ProcessCmdKey少砍十岁上下。



Answer 3:

我使用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;
        }
    }


Answer 4:

见鲁道夫·诺伯的回答为最佳答案


(我原来的答复):

从控制类派生,并且可以重写给ProcessCmdKey方法。 微软选择,因为它们影响多个控件和将焦点移到忽略来自的KeyDown事件这些键,但是这使得它很难做出一个应用程序应对这些键以任何其他方式。



Answer 5:

不幸的是,这是相当困难的。使用箭头键来实现这一点,由于事件的KeyDown限制。 不过,也有一些方法来解决这个问题:

  • 作为@Snarfblam说,你可以重写给ProcessCmdKey方法 ,它保留了解析箭头按键的功能。
  • 由于从这个问题的答案接受状态,XNA有一个叫做Keyboard.GetState()内置的方法,它允许您使用箭头键输入。 然而,的WinForms没有这一点,但它可以通过一个的P / Invoke, 进行 使用的一类,与它帮助

我建议您尝试使用类。 这是很简单的可以这样做:

var left = KeyboardInfo.GetKeyState(Keys.Left);
var right = KeyboardInfo.GetKeyState(Keys.Right);
var up = KeyboardInfo.GetKeyState(Keys.Up);
var down = KeyboardInfo.GetKeyState(Keys.Down);

if (left.IsPressed)
{
//do something...
}

//etc...

如果您使用此结合KeyDown事件,我想你可以可靠地完成自己的目标。



Answer 6:

调用WPF窗口的WinForms出来的时候我也有类似的问题。

var wpfwindow = new ScreenBoardWPF.IzbiraProjekti();
    ElementHost.EnableModelessKeyboardInterop(wpfwindow);
    wpfwindow.Show();

然而,作为显示一个对话框窗口,它的工作

var wpfwindow = new ScreenBoardWPF.IzbiraProjekti();
    ElementHost.EnableModelessKeyboardInterop(wpfwindow);
    wpfwindow.ShowDialog();

希望这可以帮助。



Answer 7:

为了捕捉在窗体控件按键,你必须推导是基于类的,你想控制的一个新的类,并且重写给ProcessCmdKey()。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    //handle your keys here
}

例如:

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;
    }

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

完整的源... 在C#中的箭头键

Vayne



Answer 8:

做最好的方法,我认为,是处理它像MSDN上说http://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown.aspx

但是,处理它,怎么你真的需要它。 我的方式(在下面的例子)是捕捉每一个的KeyDown ;-)

    /// <summary>
    /// onPreviewKeyDown
    /// </summary>
    /// <param name="e"></param>
    protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e)
    {
        e.IsInputKey = true;
    }

    /// <summary>
    /// onKeyDown
    /// </summary>
    /// <param name="e"></param>
    protected override void OnKeyDown(KeyEventArgs e)
    {
        Input.SetFlag(e.KeyCode);
        e.Handled = true;
    }

    /// <summary>
    /// onKeyUp
    /// </summary>
    /// <param name="e"></param>
    protected override void OnKeyUp(KeyEventArgs e)
    {
        Input.RemoveFlag(e.KeyCode);
        e.Handled = true;
    }


Answer 9:

我有同样的问题,并已经使用在所选择的答案代码。 这个环节是为我的答案; 也许别人也。

如何在WinForm的禁用导航C#中的箭头?



文章来源: Up, Down, Left and Right arrow keys do not trigger KeyDown event