的Window.Owner
属性只适用于情况下,父窗口是一个WPF窗口。由于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,虽然我没有设置窗口的父窗口。 正如我在我的问题中写的那样,rect是级联的。 无论如何您的答案! – Lumo
现在我明白了。是否有可能得到“DesktopWindow”的句柄?有一个支持窗口句柄总是覆盖整个屏幕。您可以使用GetDesktopWindow函数获取句柄。也许这有助于找出什么是窗口的真正父母? – Nitram
我检查了DesktopWindow指针,它是一个不同的指针。 每个新窗口都有另一个所有者句柄,并且这个新所有者窗口被级联。 这不是WPF中窗口的默认行为吗? – Lumo