如何通过z-index对Windows进行排序?

时间:2010-08-13 00:15:11

标签: wpf z-index

如果我在Application.Current.Windows中枚举窗口,我怎么能知道,对于任何两个窗口,哪一个“更接近”(即具有更大的z-index)?

或者,换句话说,我怎样才能通过z-index对这些窗口进行排序?

2 个答案:

答案 0 :(得分:7)

您无法从WPF获取Window的Z Order信息,因此您必须求助于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 = GetWindow(hWnd, GW_HWNDNEXT)
    if(byHandle.ContainsKey(hWnd))
      yield return byHandle[hWnd];
}

const uint GW_HWNDNEXT = 2;
[DllImport("User32")] static extern IntPtr GetTopWindow(IntPtr hWnd);
[DllImport("User32")] static extern IntPtr GetWindow(IntPtr hWnd, uint wCmd);

这种方式的工作原理是:

  1. 它使用字典按窗口句柄索引给定的窗口,使用的事实是在WPF的Windows实现中,Window的PresentationSource始终是HwndSource。
  2. 它使用Win32从上到下扫描所有未显示的窗口,以找到正确的顺序。

答案 1 :(得分:0)

啊这是一个非常有趣的人:

[DllImport("user32.dll")]
static extern IntPtr GetActiveWindow();

public static Window ActiveWindow
{
    get
    {
        return HwndSource.FromHwnd(GetActiveWindow()).RootVisual as Window;
    }
}

它将为您提供应用中的活动窗口(通常是最重要的)。