【问题标题】:WPF Window has Owner handle but no OwnerWPF 窗口有所有者句柄但没有所有者
【发布时间】:2016-07-29 09:00:01
【问题描述】:

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

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

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

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

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

最好的问候 鲁默

【问题讨论】:

    标签: wpf window


    【解决方案1】:

    Window.Owner 属性仅适用于父窗口是 WPF 窗口的情况。由于windows的整个父子结构都是由操作系统来处理的,所以在不同框架的windows之间建立这样的关系是非常有可能的。

    因此,如果您能够使用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。在这种情况下,您的句柄无效或为空。在这种情况下,您必须退回到屏幕大小以使窗口居中。

    编辑 1: 因为我完全误解了实际问题,所以这里有另一个想法。有一个始终覆盖整个屏幕的辅助“窗口”句柄。如果我正确理解该概念,则桌面上显示的窗口始终附加到此桌面窗口。您可以使用GetDesktopWindow 函数获取句柄。

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

    【讨论】:

    • 我认为你没有明白这一点。我已经使用了 GetWindowRect,它返回 true,尽管我没有为窗口设置任何父级。正如我在问题中所写的那样,矩形是级联的。无论如何感谢您的回答!
    • 啊,我明白了。您是否有可能获得“DesktopWindow”的句柄?有一个始终覆盖整个屏幕的支撑窗口手柄。您可以使用GetDesktopWindow 函数获取它的句柄。也许这有助于找出窗口的真正父级是什么?
    • 我检查了 DesktopWindow 指针,它是一个不同的指针。对于每个新窗口,都有另一个所有者句柄,并且这个新的所有者窗口是级联的。这不是 WPF 中窗口的默认行为吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2010-09-13
    • 2010-11-06
    • 2017-06-23
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多