捕获窗口消息(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
为例。添加新选项卡时,可以单击以在选项卡中导航,然后单击选项卡的可设计区域,开始设计选项卡页面的内容。这是怎么做到的呢?
好吧,设计师吃了一些消息。如果您希望将所有消息发送到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
,单击它。现在你应该在设计器中也看到消息框了:)