Vous ne pouvez pas obtenir les informations d'une commande Z de Windows à partir de WPF, vous devez donc utiliser Win32.
Quelque chose comme cela devrait faire l'affaire:
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);
La façon dont cela fonctionne est:
- Il utilise un dictionnaire pour indexer les fenêtres données par la poignée de fenêtre, en utilisant le fait que l'implémentation Windows de WPF, PresentationSource de Windows est toujours HwndSource.
- Il utilise Win32 pour analyser toutes les fenêtres non exécutées de haut en bas pour trouver l'ordre approprié.
Et oui, désolé, cela nécessite une autorisation de code non géré ("confiance totale"). –
Je l'accepterai néanmoins, car c'est la seule réponse à ce jour. –
Pourriez-vous s'il vous plaît jeter un oeil à ma dernière question? Je voudrais vraiment voir votre angle sur le problème. http://stackoverflow.com/questions/3642763/static-verification-of-bindings –