【问题标题】:Capture Window Messages (WM) in WinForms Designer using WndProc使用 WndProc 在 WinForms 设计器中捕获窗口消息 (WM)
【发布时间】:2015-05-27 05:12:16
【问题描述】:

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

【问题讨论】:

  • 我可能在这里遗漏了一些东西,但它是如何工作的?当您查看设计器时,您的程序没有运行。
  • @Octopoid - 即使在设计模式下,您的代码仍然可以运行 - 某些消息允许通过 WndProc 循环,但根据我的评论,我认为点击在到达控件本身之前就已处理。 (见更新)
  • 很公平,我并没有真正使用设计器 - 在处理完事件后将 base.WndProc(ref m); 移动到方法的末尾会发生什么?
  • @Octopoid - 没什么,同样的问题。
  • 嗯,我希望基本方法只是将消息重置为无。我刚刚发现了这个:if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) - 不会立即提供帮助,但我想知道这是否是实现自定义设计器功能的难题的一部分。我经常想知道TabControl 等是如何做到的..

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


【解决方案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,点击它。现在您应该也可以在设计器中看到消息框了 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多