发送击键以控制.Net

时间:2009-10-13 12:50:52

标签: c# .net

我的ActiveX控件包含绘制的各种形状。控件中使用CTRL-A来选择所有对象。类似地,CTRL-C要复制,CTRL-V要粘贴等等。

但是,当我在.Net应用程序中的Windows窗体中插入此控件时,它不会收到这些键盘事件。我尝试添加一个PreviewKey事件,这确实允许发送某些击键,例如TAB,但不是这些修改过的密钥。

有人知道如何将修改过的键击重定向到用户控件吗?

感谢。

4 个答案:

答案 0 :(得分:1)

ActiveX控件可能没有焦点,因此没有接收到键事件。您可能希望在表单级别处理键事件,然后在ActiveX控件上调用相应的方法。如果您将表单的KeyPreview属性设置为true,您的表单将收到表单上所有控件的关键事件。这样,无论当前关注什么控件,您的快捷方式都应该有效。这是一个可以用来测试它的快速示例。创建一个包含多个不同控件的新表单,并修改代码,如下所示:

public Form1()
{
    InitializeComponent();

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

    KeyUp += new KeyEventHandler(Form1_KeyUp);
}

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

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

答案 1 :(得分:0)

您需要捕获密钥并覆盖ProcessCmdKey方法。

class MyDataGrid : System.Windows.Forms.DataGrid

    {
       protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
       {
           ...........

       }
    }

http://support.microsoft.com/kb/320584

答案 2 :(得分:0)

KeyPreview只是错误的方法。尝试使用KeyUp或KeyDown,如下所示:

        private void ControlKeyTestForm_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Control && e.KeyCode == Keys.A)
                 this.label1.Text = "Ctrl+A pressed";
        }

如果您希望包含表单处理快捷键,请记住将表单上的KeyPreview属性设置为true,然后在表单中设置KeyDown或KeyUp处理程序。

答案 3 :(得分:0)

使用Control.ModifierKeys属性检查修改键。

例如,要检查shift键,

尝试if((Control.ModifierKeys& Keys.Shift)== Keys.Shift){}

这里有完整的例子:

http://msdn.microsoft.com/en-us/library/aa984219%28VS.71%29.aspx