KeyPreview(KeyUp)处理程序将KeyUp传递给方法中创建的表单

时间:2010-07-06 11:13:13

标签: c# .net winforms keyboard

问题

奇怪的问题。我们有两种形式:主应用程序窗口和设置表单。主窗体的 KeyPreview 设置为true,并且附加到 KeyUp 事件的方法。这样可以使用快捷键(ctrl-m)打开设置窗口:

private void MyShortcuts(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.M)
    {
        e.Handled = true;
        e.SuppressKeyPress = true;
        MySettings sett = new MySettings();
        sett.Show();
    }
}

现在,这一点工作正常。但问题是,尽管将 Handled SuppressKeyPress 属性设置为 true ,仍然会传递 KeyUp 事件到MySettings表格。我已将此跟踪到ControlNativeWindow.OnMessage接收看似不同的事件(其 Handled SuppressKeyPress 属性设置为false),并将其传递给形式及其集中控制。

问题

  • 首先,尽管指示.Net不这样做,为什么会传递这个事件?
  • 其次,如何防止事件发生?

任何想法都会受到高度赞赏,我自己也用完了。

2 个答案:

答案 0 :(得分:2)

这里发生的是MCTRL键正在引发两个单独的KeyUp事件(这是正常行为)。当您按CTRL然后M,然后将手指从M键抬起时,会引发KeyUp事件,主表单上的处理程序会捕获并使用显示设置表单。然后,您将手指从CTRL键移开,这会引发另一个KeyUp事件(这次是在设置表单上,现在是活动表单)。

在设置表单上,您只需检查e.Control并忽略该事件true

答案 1 :(得分:0)

您应该使用KeyDown事件代替KeyUp事件。

如果你看一下你会看到的documentation,那么在KeyUp事件发生之前,将会抛出一个KeyPress事件,这将被你的设置表单捕获。