WPF窗口拥有所有者句柄,但没有所有者
我创建了一个没有Window.Owner
的正常WPF窗口。 检查其WindowInteropHelper.Owner
属性时,此窗口拥有所有者句柄集。我还认识到,拥有的窗口矩形与每个新窗口(使用GetWindowRect)在桌面上的某个地方级联。WPF窗口拥有所有者句柄,但没有所有者
有谁能告诉我发生了什么事吗? 如果没有真正的所有者,它是否像wpf中的默认行为,用于将启动位置设置为所有者中心?
的事情是,我想,为了能够在窗口中心到真正的所有者窗口中心或区分两种案例 - 如果没有主人 - 屏幕中心(!):
- 窗口所有者(例如,如果在VSTO插件使用)的非WPF窗口
- 没有在行动上没有所有者窗口
如果任何人有一个想法,我怎么能区分或achive我的要求,我会很高兴:)
个问候 鲁磨
的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