使用 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
,则需要创建自定义控件设计器并将它们发送到控件。
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
,然后单击它。现在你也应该在设计器中看到消息框:)
我正在用 .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
,则需要创建自定义控件设计器并将它们发送到控件。
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
,然后单击它。现在你也应该在设计器中看到消息框:)