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

时间:2015-05-26 20:46:40

标签: c# .net winforms wndproc windows-messages

我正在.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为例。添加新选项卡时,可以单击以浏览选项卡,然后单击选项卡的可设计区域以开始设计选项卡页面的内容。这有什么作用?

1 个答案:

答案 0 :(得分:1)

好吧,设计师吃了一些消息。如果您希望将所有邮件发送到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,然后单击它。现在您应该在设计器中看到消息框:)