我需要将 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
但是即使是这个事件,我也没有收到,但有一些控制集中,而不是其他。
KeyDown
事件?答案 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)
听起来像是你想要global hook来按下按键。
如果按照开始的方式进行操作,则必须处理表单(或每个表单)上每个控件的keypress / keydown事件。
修改强>
如果您使用与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