2016-07-29 147 views
0

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

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

的事情是,我想,为了能够在窗口中心到真正的所有者窗口中心或区分两种案例 - 如果没有主人 - 屏幕中心(!):

  • 窗口所有者(例如,如果在VSTO插件使用)的非WPF窗口
  • 没有在行动上没有所有者窗口

如果任何人有一个想法,我怎么能区分或achive我的要求,我会很高兴:)

问候 鲁磨

回答

0

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

我觉得你没有明白这一点。我已经使用过GetWindowRect,并且它返回true,虽然我没有设置窗口的父窗口。 正如我在我的问题中写的那样,rect是级联的。 无论如何您的答案! – Lumo

+0

现在我明白了。是否有可能得到“DesktopWindow”的句柄?有一个支持窗口句柄总是覆盖整个屏幕。您可以使用GetDesktopWindow函数获取句柄。也许这有助于找出什么是窗口的真正父母? – Nitram

+0

我检查了DesktopWindow指针,它是一个不同的指针。 每个新窗口都有另一个所有者句柄,并且这个新所有者窗口被级联。 这不是WPF中窗口的默认行为吗? – Lumo

相关问题