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