如果我列舉了Application.Current.Windows
中的窗口,我怎麼能告訴,對於任何兩個窗口,哪一個「更接近」(即具有更大的z-索引)?或者,換句話說,我怎樣才能用z-index對這些窗口進行排序呢?如何使用z-index對Windows進行排序?
6
A
回答
6
您無法從WPF獲取Window的Z訂單信息,因此您必須使用Win32。
像這樣的東西應該做的伎倆:
var topToBottom = SortWindowsTopToBottom(Application.Current.Windows.OfType<Window>());
...
public IEnumerable<Window> SortWindowsTopToBottom(IEnumerable<Window> unsorted)
{
var byHandle = unsorted.ToDictionary(win =>
((HwndSource)PresentationSource.FromVisual(win)).Handle);
for(IntPtr hWnd = GetTopWindow(IntPtr.Zero); hWnd!=IntPtr.Zero; hWnd = GetNextWindow(hWnd, GW_HWNDNEXT)
if(byHandle.ContainsKey(hWnd))
yield return byHandle[hWnd];
}
const uint GW_HWNDNEXT = 2;
[DllImport("User32")] extern IntPtr GetTopWindow(IntPtr hWnd);
[DllImport("User32")] extern IntPtr GetNextWindow(IntPtr hWnd, uint wCmd);
其工作原理是:
- 它使用字典來指數給出的Windows的窗口句柄,使用的事實, WPF的Windows實現,Window的PresentationSource始終是HwndSource。
- 它使用Win32從上到下掃描所有未經過授權的窗口,找到正確的順序。
0
啊,這是一個非常有趣的一個:
[DllImport("user32.dll")]
static extern IntPtr GetActiveWindow();
public static Window ActiveWindow
{
get
{
return HwndSource.FromHwnd(GetActiveWindow()).RootVisual as Window;
}
}
它會給你在你的應用程序的活動窗口(這通常是最重要的)。
+0
我認爲這不是他的意思 – 2010-08-13 00:46:33
+2
這不僅僅是我的意思,它還需要完全信任(就像任何P/Invoke一樣)。它可能甚至是值得的,用Window.IsActive屬性是不容易實現的。 – 2010-08-13 00:55:13
相關問題
- 1. 如何在Windows 8.1中使用C#對ListView進行排序
- 2. 如何使用穩定排序對DataGrid進行排序?
- 3. 如何使用Bubble排序對我的JTable進行排序?
- 4. 如何使用多個排序條件對ArrayList進行排序?
- 5. 如何使用數字排序對varchar列進行排序
- 6. 如何對json對象進行排序?
- 7. 如何對行組進行排序?
- 8. 如何根據Windows電話的順序對日期進行排序或排序
- 9. 如何使用快速排序對一對整數的結構進行排序?
- 10. 如何使用compareto()對Person對象進行排序?
- 11. 如何使用類對象對NSMutableArray進行排序?
- 12. 如何使用嵌套屬性對RealmList對象進行排序?
- 13. 如何使用動態對象對列表進行排序
- 14. 如何使用多圖對對象進行排序?
- 15. 如何使用集合對對象的屬性進行排序
- 16. 如何對JSON中的對象進行排序? (使用Python 2.7)
- 17. 如何使用js根據鍵對JSON對象進行排序?
- 18. 如何使用自定義對象對NSMutableArray進行排序?
- 19. 在Windows中使用Cygwin對文件進行排序
- 20. 使用XSLT對XML元素進行排序並對數據進行排序
- 21. 如何使用Perl按升序對日期進行排序?
- 22. 如何使用Linq對列表順序進行排序?
- 23. 如何使用數組順序對此集合進行排序?
- 24. 如何使用sails-js以降序對數據進行排序?
- 25. 如何使用NSArrayController對NSTableView中的行進行重新排序
- 26. 如何使用jQuery UI進行排序來排序第二行?
- 27. 如何在Windows Phone 8中對字典值進行排序?
- 28. 如何在python中對文件的數據進行排序(windows)
- 29. 如何使用領域進行排序?
- 30. 如何使用postgresql進行排序?
是的,很抱歉,這確實需要非託管代碼權限(「完全信任」)。 – 2010-08-13 04:55:30
不過我會接受的,因爲這是目前唯一的答案。 – 2010-08-13 14:49:45
你能看看我最近的問題嗎?我真的很想看到你在這個問題上的角度。 http://stackoverflow.com/questions/3642763/static-verification-of-bindings – 2010-09-04 22:56:01