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();