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

窗体不响应按键关闭事件

  •  56
  • BoltClock  · 技术社区  · 14 年前

    我在Windows窗体项目上工作了一段时间,我决定尝试使用键盘快捷键。读了一段之后,我想我只需要编写一个事件处理程序并将其绑定到窗体的KeyDown事件:

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control && e.Alt && e.KeyCode == Keys.O)
        {
            MessageBox.Show("Ctrl+Alt+O: magic!");
        }
    }
    

    我用一种很好的方法打开visualstudio设计器的Properties面板,然后双击表单的KeyDown事件来生成 Form1_KeyDown 事件处理程序。但在测试我的应用程序时,表单对 Ctrl键 + 中高音 + 键盘快捷键。Visual Studio设计器确实生成了将事件处理程序绑定到窗体的代码:

    private void InitializeComponent()
    {
        // ...
    
        this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);
    
        // ...
    }
    

    所以我试着加了一个 Console.WriteLine() 调用处理程序以检查它是否被调用,但也没有运气。

    为了确保我正确地完成了前几个步骤,我试着用以下方法重复这些步骤:

    • 同一溶液中的新形式。
      Ctrl键 + 中高音 O 再试一次,效果很好。

    • 全新的WinForms解决方案。
      它工作得很好:消息对话框出现 Console.WriteLine() 呼叫也有效)。

    所以我在这里迷路了。是什么阻止这个项目中的所有窗体接收KeyDown事件?

    3 回复  |  直到 12 年前
        1
  •  180
  •   jeffgabhart    9 年前

    表单的KeyPreview属性是否设置为true?

    获取或设置一个值,该值指示窗体是否接收键

    http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview.aspx

        2
  •  58
  •   Community pid    7 年前

    关于这个问题最常见的建议是StackOverflow和MSDN 1 , 2

    KeyDown 事件是在 Form 只要它是 KeyPreview 属性设置为 true

    对于大多数目的来说,这是足够的,但它有两个原因:

    1. 按下 处理程序 do not see all keys . 具体来说,“你看不到用于导航的按键类型。像光标键和制表符一样,退出并输入对话框。“

    2. 截获关键事件有几种不同的方法,它们都是按顺序发生的。 按下 已处理 最后的 关键点预览

    (这些分数归功于@HansPassant。)

    相反,重写 ProcessCmdKey 在你的 形式 :

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == Keys.Up)
        {
            // Handle key at form level.
            // Do not send event to focused control by returning true.
            return true;
        }
      return base.ProcessCmdKey(ref msg, keyData);
    }
    

    这样,所有键对方法都是可见的,并且方法是第一个看到事件的行。

    请注意,您仍然可以控制聚焦控件是否看到 按下 事件。回来吧 按下 事件,而不是设置 KeyPressEventArgs.Handled 是的 就像你在一个 按下 事件处理程序。 Here 是一篇更详细的文章。

        3
  •  23
  •   Seb Charrot    14 年前

    尝试设置 KeyPreview