首页 文章

WPF窗口具有所有者句柄但没有所有者

提问于
浏览
0

我创建了一个没有 Window.Owner 的普通WPF窗口 . 检查其 WindowInteropHelper.Owner 属性时,此窗口设置了所有者句柄 . 我还认识到,拥有的窗口矩形在桌面上的某个位置与每个新窗口级联(使用GetWindowRect) .

谁能告诉我那里发生了什么?如果没有真正的所有者,它是否类似于wpf中的默认行为,用于将启动位置设置为所有者的中心?

问题是,我想区分两种情况,以便能够将窗口置于真实(!)所有者窗口中心或 - 如果没有所有者 - 屏幕中心:

  • 窗口所有者是非wpf窗口(例如,如果在vsto插件中使用)

  • 没有所有者窗口

如果有人知道如何区分或满足我的要求,我会很高兴:)

最好的问候Lumo

1 回答

  • 0

    Window.Owner 属性仅在父窗口是WPF窗口的情况下有效 . 由于窗口的整个父子结构由操作系统处理,因此很有可能在不同框架的窗口之间 Build 这种关系 .

    因此,如果您能够使用 WindowInteropHelper 检索窗口句柄,您就知道有一个所有者窗口 . 但它可能是本机窗口或Windows窗体窗口 .

    由于您只需要所有者窗口的边界框,因此您可以轻松使用Windows API来获取边界框 . 您想要使用的功能是:GetWindowRect

    我假设您使用的是托管语言,如C#或VB.net,因此有一个示例如何使用C#访问该函数:

    [DllImport("user32.dll", SetLastError = true)]
    static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
    
    [StructLayout(LayoutKind.Sequential)]
    public struct RECT {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }
    

    函数所需的句柄是使用 WindowInteropHelper 获取的窗口句柄 .

    如果您的句柄没有指向窗口,该函数将返回 false . 在这种情况下,您的句柄无效或为空 . 在这种情况下,您必须回退到屏幕大小以使窗口居中 .

    EDIT 1: 由于我完全误解了实际问题,这是另一个想法 . 有一个帮助器"window"句柄始终覆盖整个屏幕 . 如果我正确理解了该概念,则桌面上显示的窗口始终会附加到此桌面窗口 . 您可以使用GetDesktopWindow函数获取句柄 .

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr GetDesktopWindow();
    

相关问题