使用 WndProc 在 WinForms Designer 中捕获 Window 消息 (WM)

Capture Window Messages (WM) in WinForms Designer using WndProc

我正在用 .NET Windows Forms 编写自定义控件。考虑以下代码:

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);
    switch(m.Msg)
    {
        case WM_LBUTTONDOWN: // Yes, it's defined correctly.
            MessageBox.Show("Left Button Down");
            break;
    }
}

它在 运行 时有效,但我需要它在设计器中工作。我怎样才能做到这一点?

注意:

我猜有人可能会说“您无法在设计器中检测到点击,因为设计界面会捕获它们并将其作为设计过程的一部分进行处理

...以TabControl为例。添加新选项卡时,您可以单击以浏览选项卡,然后单击选项卡的可设计区域开始设计选项卡页面的内容。它是如何工作的?

好吧,设计师吃了一些消息。如果要将所有消息都发送到Control,则需要创建自定义控件设计器并将它们发送到控件。

参考ControlDesigner.WndProc

public class CustomDesigner : ControlDesigner
{
    protected override void WndProc(ref Message m)
    {
        DefWndProc(ref m);//Passes message to the control.
    }
}

然后将 DesignerAttribute 应用到您的自定义控件。

[Designer(typeof(CustomDesigner))]
public partial class MyUserControl : UserControl
{
    public MyUserControl()
    {
        InitializeComponent();
    }

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        const int WM_LBUTTONDOWN = 0x0201;
        switch (m.Msg)
        {
            case WM_LBUTTONDOWN: // Yes, it's defined correctly.
                MessageBox.Show("Left Button Down");
                break;
        }
    }
}

将您的控件拖到 Form,然后单击它。现在你也应该在设计器中看到消息框:)