1

我在使用 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 来解决它,但它很混乱,需要一些焦点转移才能工作。有什么建议么?

4

1 回答 1

0

也尝试覆盖Control.IsInputKey并注意您有兴趣处理的键。如果这也不起作用,并且您无法控制 ActiveX 控件源代码,则可以尝试使用 WinAPI 的SetWindowsHookEx ( KeyboardProc ) 来处理这种情况。p/invoke 签名在这里定义。

[已编辑]要覆盖IsInputKey,您需要从中派生一个新类AxDirControlLib.AxDirList并在该类中执行此操作。然后将该类的实例添加到表单而不是AxDirControlLib.AxDirList.

于 2013-09-09T04:37:54.400 回答