Как отсортировать Windows по z-индексу? - PullRequest
6 голосов
/ 13 августа 2010

Если я перечисляю окна в Application.Current.Windows, как я могу сказать для любых двух окон, какое из них "ближе" (т.е. имеет больший z-индекс)?то же самое, другими словами, как я могу отсортировать эти окна по z-index?

Ответы [ 2 ]

7 голосов
/ 13 августа 2010

Вы не можете получить информацию о порядке Z в Windows из WPF, поэтому вы должны прибегнуть к 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, PresentationSource для Window всегда является HwndSource.
  2. Он использует Win32 для сканированиявсе непареные окна сверху вниз, чтобы найти правильный порядок.
0 голосов
/ 13 августа 2010

Ах, это было действительно забавно:

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

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

Это даст вам активное окно в вашем приложении (которое обычно является основным).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...