2009-03-11 10 views
2

Essayer de creuser dans l'API win32 de mon application WPF (qui passe juste à travers le systray). Lorsque je clique sur l'icône de la barre des tâches, je présente à l'utilisateur un menu contextuel qui permet de mettre au point la fenêtre la plus haute.C# - Win32: Obtenir un handle à la fenêtre la plus haute, après avoir perdu le focus?

Je veux obtenir une poignée de cette fenêtre (celle qui vient de perdre l'accent) et ont essayé différentes approches utilisant

GetForeGroundWindow() 
GetTopWindow() 
GetDesktopWindow() 

sans fin cependant. J'envisage actuellement l'itération à travers tous les processus, pour obtenir les MainWindowHandles et vérifier l'ordre z de chaque fenêtre. Mais j'ai estimé qu'il y a une manière plus facile/plus intelligente; tout simplement un je ne peux pas google ou rappeler de mon vieux tome de Petzold.

Une autre manière serait pour mon menu de la barre des tâches pas pour gagner le focus lorsqu'il est activé?

Merci!

Répondre

2

Vous pouvez obtenir la fenêtre la plus élevée avant en ouvrant le menu, quel que soit l'élément de menu que l'utilisateur choisira éventuellement. Puis, si vous avez besoin de la fenêtre la plus haute, vous pouvez simplement utiliser la valeur que vous avez avant d'ouvrir le menu.

+0

Bien sûr! Essayer de trouver l'événement de mise au point à remplacer, mais en train de faire la vérification avec un DispatcherTimer. –

0

Je ne pense pas qu'il y ait quelque chose de plus simple que l'itération de z-index décrite. Le menu de la barre des tâches a le pour obtenir le focus, car sinon les utilisateurs ne pourront pas l'utiliser (par exemple avec un clavier). Et s'il obtient le focus, alors il devient la fenêtre de premier plan, donc l'ancienne fenêtre de premier plan est laissée sans aucune distinction de toute autre fenêtre d'inactivation dans le système. Vraiment, le z-index vérifier à mon humble avis est le seul moyen.