如何检查窗口是不是为 MDI 窗口?

Posted

技术标签:

【中文标题】如何检查窗口是不是为 MDI 窗口?【英文标题】:How Can I Check if a Window is an MDI Window?如何检查窗口是否为 MDI 窗口? 【发布时间】:2011-10-30 16:35:19 【问题描述】:

我想我可以使用一些 user32.dll 调用来验证窗口是否是 MDI 窗口,例如使用 DefMDIChildProc 并查看它是否失败,但我想知道这是否有任何限制,或者是否有更好的方法去做这个?检查父母是否足够?

为简单起见,我最终希望的是一种 IsMDI(IntPtr ptr) 调用...

想法?有什么建议吗?

【问题讨论】:

【参考方案1】:

如果控件位于您自己的 .NET 应用程序中,Form class 具有用于处理 MDI 窗口的属性:

Form.IsMdiChild

Form.IsMdiContainer

Form.MdiParent

Form.MdiChildren

【讨论】:

我正在尝试找出任何正在运行的 Window 进程上的任何窗口是否是 MDI 窗口,我没有使用我自己的对象。 @AlishahNovin,我希望这不是您的反对意见 - 惩罚未满足您未指定要求的人是不公平的。在您最初的问题中根本不清楚这些窗口不是您的应用程序的一部分。【参考方案2】:

我已经弄明白了(在 pinvoke.net 的帮助下)——您可以根据扩展的 Windows 样式找到答案:

        public static bool IsMDI(IntPtr hwnd)
        
            WINDOWINFO info = new WINDOWINFO();
            info.cbSize = (uint)Marshal.SizeOf(info);
            GetWindowInfo(hwnd, ref info);
            //0x00000040L is the style for WS_EX_MDICHILD
            return (info.dwExStyle & 0x00000040L)==1;
        

        [StructLayout(LayoutKind.Sequential)]
        private struct WINDOWINFO
        
            public uint cbSize;
            public RECT rcWindow;
            public RECT rcClient;
            public uint dwStyle;
            public uint dwExStyle;
            public uint dwWindowStatus;
            public uint cxWindowBorders;
            public uint cyWindowBorders;
            public ushort atomWindowType;
            public ushort wCreatorVersion;

            public WINDOWINFO(Boolean? filler)
                : this()   // Allows automatic initialization of "cbSize" with "new WINDOWINFO(null/true/false)".
            
                cbSize = (UInt32)(Marshal.SizeOf(typeof(WINDOWINFO)));
            

        

        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool GetWindowInfo(IntPtr hwnd, ref WINDOWINFO pwi);

【讨论】:

以上是关于如何检查窗口是不是为 MDI 窗口?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 MDI 子窗口保持在其兄弟窗口之上?

vb6中如何实现类似MDI子窗体的窗体

如何更改 MDI 子窗口图标?

vb的 mdi窗口的问题

MDI 窗口的创建

如何避免在添加新的MDI子窗口时出现屏幕跳动