2009-03-07 4 views
4

J'ai une application qui se trouve dans la barre d'état système, qui, lorsqu'on double-clique sur ouvre une fenêtre, assez standard; Cependant, lorsque vous fermez la fenêtre, je voudrais que la fenêtre qui a été focalisée avant que le soit ouverte pour que le focus soit remis. Si j'ouvre ma fenêtre avec un raccourci clavier, je peux rétablir la mise au point précédente en utilisant l'appel API GetForegroundWindow avant que ma fenêtre ne s'affiche, puis la méthode SetForegroundWindow après la fermeture de ma fenêtre (avec la valeur de le premier appel) pour restaurer la mise au point. Cela ne fonctionne pas lorsque vous ouvrez la fenêtre dans la barre d'état système, car l'utilisateur a essentiellement fait la mise au point de la barre d'état système.Restaurer le focus de la fenêtre sur le précédent propriétaire

J'ai essayé d'utiliser une combinaison de GetForegroundWindow, GetWindow et GetTopMostWindow pour essayer de naviguer dans l'ordre z pour trouver la deuxième fenêtre après la barre d'état système (en cours de l'hypothèse que le plateau du système aura sauté au sommet , donc logiquement le suivant serait le front d'origine). Je n'ai pas eu de succès cependant, les résultats de ces fonctions sont assez inutiles car ils ne semblent pas me donner une structure logique.

Est-ce que quelqu'un a des idées sur la façon dont je pourrais y parvenir? Je pensais à une sorte d'observateur d'arrière-plan, qui s'assoit juste et surveille qui est la fenêtre avant et stocke un pointeur vers lui, mais ce sera floconneux au mieux.

Ceci est sur Windows (je suis personnellement sur x64 Server 2008) et avec .Net 3.5.

Répondre

2

Bien que cela puisse être une fonctionnalité intéressante, vous savez probablement qu'avec Windows 7, le plateau aura une place (beaucoup) moins importante sur le bureau. La seule façon de le faire est de surveiller les messages Windows et de déterminer quelle fenêtre a été mise au point avant que l'application ne se mette au point. En plus de ça AFAIK, il n'y a pas grand chose à faire.

+0

C'est ce que je fais en lançant des raccourcis clavier, mais quand il s'agit d'utiliser le bac, la dernière application qui a eu le focus avant le mien est le bac! J'étais à peu près sûr qu'il n'y aurait pas une bonne solution à cela, mais ce n'est pas mon mécanisme d'utilisation primaire de toute façon. –

+0

Avec "Monitor Windows Messages", je veux vraiment dire cela. Vous pouvez par exemple vous rappeler les 4 dernières fenêtres qui ont eu le focus et revenir dans la file d'attente en sautant la barre d'état système pour obtenir le handle de la fenêtre qui avait le focus avant cela. Ce n'est pas facile cependant et exigera des appels d'API système –

+0

J'ai essayé de faire une telle chose, mais je ne pouvais pas sembler obtenir la bonne combinaison d'appels. J'ai essayé d'avancer et de reculer en utilisant GetWindow depuis GetTopWindow, mais je n'ai pas eu de chance. Avez-vous des conseils? –

1

J'ai regardé toutes les icônes de la barre d'état système et elles ont le même comportement que votre programme. Messing avec la gestion de focus de Windows est difficile, vous pourriez vouloir réfléchir à deux fois (ou plus) avant d'essayer de changer le comportement standard.

+0

J'apprécie l'avertissement, mais ce comportement est souhaité. L'application agit comme une superposition, que vous utilisez pour insérer du texte dans l'application qui a eu le focus. Cela fonctionne très bien si vous obtenez la fenêtre par une touche de raccourci, mais la barre d'état système tue le passthrough. –

+0

Est-ce que les applications similaires aux vôtres ont le même problème? – jdigital

1

Je l'ai fait revenir la fenêtre précédente

SendKeys.Send("%{TAB}"); 

Je sais que ce n'est pas la solution », mais servir le but dans une certaine mesure.

Questions connexes