我的ActiveX控件包含绘制的各种形状。控件中使用CTRL-A来选择所有对象。类似地,CTRL-C要复制,CTRL-V要粘贴等等。
但是,当我在.Net应用程序中的Windows窗体中插入此控件时,它不会收到这些键盘事件。我尝试添加一个PreviewKey事件,这确实允许发送某些击键,例如TAB,但不是这些修改过的密钥。
有人知道如何将修改过的键击重定向到用户控件吗?
感谢。
答案 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)
{
...........
}
}
答案 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