2016-07-29 146 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

相關問題