0

我有一个 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 中的什么正在吞噬我们的击键以及我们如何告诉它停止的任何想法?

4

1 回答 1

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);
}
于 2010-10-21T17:10:58.407 回答