如何在用户控件中拦截 parent 形式的 wndproc
How can I intercept wndproc of parent form in usercontrol
有没有在用户控件中接收parent形式的wndproc的方法?
我正在制作标题栏用户控件,我想接收有关表单大小调整的 windows 消息。
(这个形式是formborderstyle=none.)
由于 WndProc
函数不会拦截所有 windows 消息,所以我习惯于创建一个 MessageFilter
,因为它会过滤每条 windows 消息。所以首先你创建一个新的 class 来实现接口 IMessageFilter
.
class MessageFilter : IMessageFilter
{
public static IntPtr MyHandle { get; set; }
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == /*windows code for resizing*/ && m.HWnd == MyHandle)
{
//do what you desire
return true;
}
else
return false;
}
}
因此您过滤所有消息并等待消息包含调整大小的代码并且该代码针对您的特定 window。在 Windows 中,所有控件(如按钮、表单...)都有一个唯一的句柄。句柄用于告诉windows消息shell发送到哪个特定控件,因此我们可以将其用作调整大小检测的标准。
MyHandle
shell 包含您要收听其调整大小的表单的 window 句柄。所以你应该设置它,例如在构造函数中:
MessageFilter.MyHandle = this.Handle;
现在我们创建了自己的 MessageFilter
,现在我们必须将它添加到您的应用程序中,它会侦听 windows 消息。这应该在构造函数中设置。
MessageFilter msgFilter = new MessageFilter();
Application.AddMessageFilter(msgFilter);
有没有在用户控件中接收parent形式的wndproc的方法?
我正在制作标题栏用户控件,我想接收有关表单大小调整的 windows 消息。
(这个形式是formborderstyle=none.)
由于 WndProc
函数不会拦截所有 windows 消息,所以我习惯于创建一个 MessageFilter
,因为它会过滤每条 windows 消息。所以首先你创建一个新的 class 来实现接口 IMessageFilter
.
class MessageFilter : IMessageFilter
{
public static IntPtr MyHandle { get; set; }
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == /*windows code for resizing*/ && m.HWnd == MyHandle)
{
//do what you desire
return true;
}
else
return false;
}
}
因此您过滤所有消息并等待消息包含调整大小的代码并且该代码针对您的特定 window。在 Windows 中,所有控件(如按钮、表单...)都有一个唯一的句柄。句柄用于告诉windows消息shell发送到哪个特定控件,因此我们可以将其用作调整大小检测的标准。
MyHandle
shell 包含您要收听其调整大小的表单的 window 句柄。所以你应该设置它,例如在构造函数中:
MessageFilter.MyHandle = this.Handle;
现在我们创建了自己的 MessageFilter
,现在我们必须将它添加到您的应用程序中,它会侦听 windows 消息。这应该在构造函数中设置。
MessageFilter msgFilter = new MessageFilter();
Application.AddMessageFilter(msgFilter);