代码之家  ›  专栏  ›  技术社区  ›  Dav

keypreview(keyup)处理程序将keyup传递到方法中创建的窗体

  •  1
  • Dav  · 技术社区  · 14 年前

    问题

    奇怪的问题。我们有两个窗体:主应用程序窗口和设置窗体。主窗体具有 密钥预览 设置为true,并将方法附加到 松开键 事件。这样可以使用快捷键(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();
        }
    }
    

    现在,那个位工作得很好。然而,问题是尽管设置了 处理 抑制按键 属性到 , the 松开键 事件仍传递给 MySettings 形式。我查到这个 ControlNativeWindow.OnMessage 接受似乎不同的事件 处理 抑制按键 属性设置为false),并将其传递给窗体及其焦点控件。

    问题

    • 首先,尽管指示.NET不要这样做,为什么事件还是会继续?
    • 第二,如何防止事件触发?

    任何想法都会很受欢迎,我自己就用光了。

    2 回复  |  直到 14 年前
        1
  •  2
  •   MusiGenesis    14 年前

    这里发生的是 M 以及 CTRL 钥匙升起两个分开的 KeyUp 事件(正常行为)。当你按下 CTRL 然后 然后把你的手指从 密钥 松开键 引发了事件,主窗体上的处理程序捕获并使用该事件来显示设置窗体。然后把你的手指从 CTRL 键,它会引发另一个 松开键 事件(这次在设置窗体上,该窗体现在是活动窗体)。

    在设置窗体上,您只需检查 e.Control 忽略事件如果是 true .

        2
  •  0
  •   Oliver    14 年前

    您应该使用keydown事件而不是keydown事件。

    如果你看一下 documentation 您将看到,在keyup事件之前,将抛出一个keypress事件,并且该事件将被设置窗体捕获。