我使用Axhost作为包装器在.NET表单中托管了一个Activex控件。 我在表单的ProcessCmdKey方法中定义了一个快捷键,但当焦点位于Activex中时,键盘消息和事件被捕获,而不是由ProcessCmdKey处理。
这是我的代码:
public partial class Form1 : Form
{
AxDirControlLib.AxDirList dirlist = null;
public Form1()
{
InitializeComponent();
this.KeyPreview = true;
}
private void Form1_Load(object sender, EventArgs e)
{
dirlist = new AxDirControlLib.AxDirList();
//dirlist.PreviewKeyDown += dirlist_PreviewKeyDown;
panel1.SuspendLayout();
dirlist.BeginInit();
panel1.Controls.Add(dirlist);
panel1.ResumeLayout();
dirlist.EndInit();
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Control | Keys.N))
{
MessageBox.Show("New project");
}
Console.Out.WriteLine("--------------MainForm---------");
Console.Out.WriteLine(keyData);
Console.Out.WriteLine("--------------MainForm---------");
return base.ProcessCmdKey(ref msg, keyData);
}
}
我确实设法通过使用Axhost的PreviewKeyDown事件处理程序中的SendKeys来解决它,但它很麻烦,需要一些焦点转移才能工作。 有什么建议吗?
答案 0 :(得分:0)
尝试覆盖Control.IsInputKey并注意您有兴趣处理的密钥。如果这也不起作用,并且您无法控制ActiveX控件源代码,则可以尝试使用WinAPI的SetWindowsHookEx(KeyboardProc)来处理这种情况。 p / invoke签名定义为here。
[已编辑] 要覆盖IsInputKey
,您需要从AxDirControlLib.AxDirList
派生一个新类并在该类中执行。然后将该类的实例添加到表单而不是AxDirControlLib.AxDirList
。