Winforms窃取COM组件的击键?

时间:2010-10-21 16:55:46

标签: .net winforms com key-events

我有一个C ++ ATL COM组件,它显示一个弹出窗口(普通的'Win32,使用WS_POPUP样式),允许用户输入一些搜索信息。该组件已针对VB6格式进行了相当广泛的测试(主要是为了便于调试),但我们希望将其与.NET winforms一起使用。

我们在winforms环境中调用组件时发现的奇怪之处在于,某些击键不再通过弹出窗口。例如:我们在弹出窗口中有一个子编辑框,用于侦听ESC键并关闭弹出窗口。在VB6中,这很有效,但是在winforms中,弹出窗口从不接收ESC的keydown事件(它可以用于其他键,如标准字母数字)。

使用该组件非常简单,但我会在这里提出一个简单的示例来解决任何问题:

public partial class Form1 : Form
{
    CustomPopup panel;

    public Form1()
    {    
        panel = new CustomPopup(); //This is the COM object
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Point p = this.PointToScreen(button1.Location);
        // Display the popup, which gives focus to a child WC_EDIT field
        panel.ShowPopupAt(p.X, p.Y);
    }
}

正如你所看到的,并不多见。那么,关于winforms中的内容的任何想法都在吃我们的击键以及我们如何告诉它停止?

1 个答案:

答案 0 :(得分:0)

尝试抑制WND消息的Windows窗体处理(在控制/表单中窃取消息):

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_LBUTTONDOWN || m.Msg == WM_LBUTTONUP || m.Msg == WM_LBUTTONDBLCLK
       )
    {
        return;
    }
    base.WndProc(ref m);
}