捕获窗口消息(WM)在WinForms设计器使用windowproc

本文关键字:windowproc WinForms 窗口 消息 WM | 更新日期: 2023-09-27 17:50:55

我正在用。net Windows窗体编写一个自定义控件。考虑下面的代码:

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为例。添加新选项卡时,可以单击以在选项卡中导航,然后单击选项卡的可设计区域,开始设计选项卡页面的内容。这是怎么做到的呢?

捕获窗口消息(WM)在WinForms设计器使用windowproc

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

ControlDesigner。指向

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,单击它。现在你应该在设计器中也看到消息框了:)