首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将键盘快捷键从Axhost传递到包含.NET窗体

如何将键盘快捷键从Axhost传递到包含.NET窗体
EN

Stack Overflow用户
提问于 2013-09-09 04:27:17
回答 1查看 233关注 0票数 1

我在一个.NET窗体中托管了一个Activex控件,使用Axhost作为包装器。我已经在窗体的ProcessCmdKey方法中定义了一个快捷键,但是当焦点位于Activex中时,键盘消息和事件将被捕获,而不是由ProcessCmdKey处理。

下面是我的代码:

代码语言:javascript
复制
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解决了这个问题,但是它很混乱,需要一些焦点转移才能工作。有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2013-09-09 12:37:54

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

编辑了以覆盖IsInputKey,您需要从AxDirControlLib.AxDirList派生一个新类,并在该类中完成。然后,将该类的实例添加到窗体中,而不是AxDirControlLib.AxDirList

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18688337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档