[英]Sending keystrokes to a Flash/Silverlight app embedded in a webbrowser control (mostly done)
[英]Sending keystrokes to control in .Net
我的ActiveX控件包含绘制的各种形状。 控件中使用CTRL-A来选择所有对象。 类似地CTRL-C复制,CTRL-V粘贴等。
但是,当我在.Net应用程序中的Windows窗体中插入此控件时,它不会收到这些键盘事件。 我尝试添加一个PreviewKey事件,这确实允许发送某些击键,例如TAB,但不允许这些修改过的键。
有人知道如何将修改过的键击重定向到用户控件吗?
谢谢。
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
方法来处理它。
您需要捕获密钥并覆盖ProcessCmdKey方法。
class MyDataGrid : System.Windows.Forms.DataGrid
{
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
...........
}
}
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处理程序。
使用Control.ModifierKeys属性检查修改键。
例如,要检查shift键,
尝试if((Control.ModifierKeys&Keys.Shift)== Keys.Shift){}
完整的例子:
http://msdn.microsoft.com/en-us/library/aa984219%28VS.71%29.aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.