c# - 如何拦截用户控件中父窗体的wndproc

标签 c# wndproc

用户控件有没有接收父窗体wndproc的方法?

我正在制作标题栏用户控件,我想接​​收有关窗体大小调整的 Windows 消息。

(这种形式是formborderstyle=none。)

最佳答案

因为 WndProc 函数不会拦截所有窗口消息,所以我习惯于创建一个 MessageFilter,因为它确实会过滤每条窗口消息。因此,首先您创建一个新类,它将实现接口(interface) 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;
    }
}

因此您过滤所有消息并等待消息包含调整大小的代码并且该代码针对您的特定窗口。在 Windows 中,所有控件(如按钮、表单...)都有一个唯一的句柄。该句柄用于告知将windows消息外壳发送到哪个特定控件,因此我们可以将其作为调整大小检测的标准。

MyHandle shell 包含您要收听其调整大小的窗体的窗口句柄。所以你应该设置它,例如在构造函数中:

MessageFilter.MyHandle = this.Handle;

现在我们创建了我们自己的 MessageFilter,现在我们必须将它添加到您的应用程序中,以便它监听 Windows 消息。这应该在构造函数中设置。

MessageFilter msgFilter = new MessageFilter();

Application.AddMessageFilter(msgFilter);

关于c# - 如何拦截用户控件中父窗体的wndproc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49004438/

相关文章:

c# - 何时使用委托(delegate)而不是接口(interface)

winapi - 如何子类化 win32 控件并保持与旧版本 comctl32.dll 的兼容性?

c# - WPF:如何使自定义模式对话框闪烁?

c# - 这些 WndProc 代码是什么意思?

vb.net - 多设备插入通知

c# - 上传到 webDAV 的非常大的文件导致 tomcat OOM 错误

c# - 如何在 Visio C# 中编写 Shape 的属性?

c# - 断言该值等于预期值集合中的任何一个

c# - MVVM + Reactive + WCF 回调

C#:如何通过窗体及其控件拖动一个?