我如何避免KeyUp事件从过滤窗口消息到覆盖的ProcessCmdKey方法后被提出



我是新来的StackOverflow,我希望能正确地写一个问题。

我想在我的winform应用程序中实现键盘快捷键。
查看微软MSDN关于键盘输入管理的文档,我了解到可以通过预处理相应的消息来拦截快捷键的压力,发送到窗体的窗口,在ProcessCmdKey方法的覆盖内。
由于我必须通过管理KeyDown和KeyUp事件来处理不同的所有其他键,无论是个人还是他们的组合,我需要当您按下并释放最后一个快捷键时不会触发这些事件。

下面是处理键盘输入的代码:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == (Keys.Control | Keys.Shift | Keys.End))
        {
            // now I need this to avoid making actions in the KeyUp event handler
            //if (filterNextKeyUp == false)
            //{
            //    filterNextKeyUp = true;
            //}
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
    private void ClientForm_KeyDown(object sender, KeyEventArgs e)
    {
        // do actions in reaction to key pressure
    }
    private void ClientForm_KeyUp(object sender, KeyEventArgs e)
    {
        // now I need this to avoid making actions in the KeyUp event handler..  
        // but I would not enter here if a shortcut was intercepted!!
        //if (filterNextKeyUp == true)
        //{
        //    filterNextKeyUp = false;
        //}
        //else
        //{
            // do actions in reaction to key release
        //}
    }

在这种情况下,压力消息被ProcessCmdKey过滤,然后KeyDown事件没有被触发,而是当你释放最后一个快捷键时触发KeyUp事件。

我如何避免KeyUp事件被触发,以类似的方式,我过滤KeyDown事件?
是否有其他方法可以重写以达到目的?

你需要'组合按钮'做一些事情时,他们没有与Ctrl, Shift或结束组合?

如果没有,也只处理ProcessCmdKey中的那些键:

public static bool HandleProcessCmdKey(this IPAMålepunktGui guiMålepunkt, Keys keyData)
        {
            switch (keyData)
            {
                case Keys.Right:
                case Keys.Right | Keys.Shift:
                case Keys.Enter:
                    // go to next field
                    return guiMålepunkt.NæsteFelt();
                case Keys.Left:
                case Keys.Left | Keys.Shift:
                    // go to previous field
                    return guiMålepunkt.ForrigeFelt();
                case Keys.Down:
                case Keys.Down | Keys.Shift:
                case Keys.Up:
                case Keys.Up | Keys.Shift:
                    // disable native navigation
                    return true;
                case Keys.Tab:
                case Keys.Tab | Keys.Control:
                    // go to next point
                    return guiMålepunkt.NæsteMålepunkt();
                case Keys.Tab | Keys.Shift:
                case Keys.Tab | Keys.Shift | Keys.Control:
                    // go to previous point
                    return guiMålepunkt.ForrigeMålepunkt();
            }
            return false;
        }

或者直接在KeyUp中处理它们,稍后捕获它们。

如果你在KeyUp中检查它们,看一下KeyEventArgs有Control和Shift(也有Alt)的属性,你可以检查。如果KeyEventArg。控件,然后将其设置为已处理。

至于结束按钮,我认为有一个键盘或其他东西,你可以调用来询问是否按下了特定的键

相关内容

  • 没有找到相关文章

最新更新