表单中的KeyDown事件

时间:2011-01-17 16:22:47

标签: .net winforms

我需要将 Ctrl + Z 组合键与自定义表单操作(撤消)相关联。

我处理Me.KeyDown事件,但每按一次键都不会收到它。也许这取决于我现有形式的当前主动控制。

当我从this article读到时,我需要

  Private Sub MyForm_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
    e.Handled = True
  End Sub

但是即使是这个事件,我也没有收到,但有一些控制集中,而不是其他。

  • 对于TextBoxes,我不能再修改文本了;
  • 对于 TextBoxes ,还有一个(Windows?) Undo-Redo默认机制,它也应该有效。
  • 如何始终在表单上收到KeyDown事件?

5 个答案:

答案 0 :(得分:4)

您可以覆盖ProcessCmdKey以处理表单级别的按键操作。

有关详细信息和示例,请参阅此问题: Hotkey (not global) in Windows Forms .NET

答案 1 :(得分:2)

您需要将表单的KeyPreview属性设置为true,以便表单接收表单上所有控件的关键事件。这样,无论当前关注什么控件,您的快捷方式都应该有效。这是一个可以用来测试它的快速示例。创建一个包含多个不同控件的新表单,并修改代码,如下所示:

public Form1()
{
    InitializeComponent();

    KeyPreview = true;  // indicates that key events for controls on the form
                        // should be registered with the form

    KeyDown += new KeyEventHandler(Form1_KeyDown);
}

void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Modifiers == Keys.Control)
    {
        switch (e.KeyCode)
        {
            case Keys.A:
                MessageBox.Show("Ctrl + A was pressed!");
                break;
            case Keys.C:
                MessageBox.Show("Ctrl + C was pressed!");
                break;
            case Keys.V:
                MessageBox.Show("Ctrl + V was pressed!");
                break;
        }
    }
}

无论您在输入组合键时控制何种焦点,都会调用表单的Form1_KeyDown方法来处理它。

答案 2 :(得分:1)

如果您的表单有菜单,那么您可以创建一个Undo MenuItem并将其快捷方式属性设置为所需的键组合。

答案 3 :(得分:0)

  1. 听起来像是你想要global hook来按下按键。

  2. 如果按照开始的方式进行操作,则必须处理表单(或每个表单)上每个控件的keypress / keydown事件。

  3. 修改

    如果您使用与e.handled = true混合的KeyPress事件,那么可能会让您到达目的地。将handle设置为true应该意味着表单接收所有事件而不是单个控件。如果您随后使用KeyPress事件来处理Ctrl + Z,那么您应该能够在窗体上运行自定义命令,而不管控件具有什么焦点(根据文档)。

答案 4 :(得分:-1)

 Private Sub form_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        KeyPreview = True
    End Sub