Question

J'ai cette application Windows Forms où il se trouve dans la zone de notification. En cliquant sur l'icône apporte à l'avant, en cliquant à nouveau (ou en cliquant sur l'application icône X) renvoie. Ceci est le type d'application qui ayant la fenêtre toujours sur le dessus est important quand il est affiché en cliquant sur l'icône (il est en option si).

Un clic droit sur l'icône fait apparaître un menu contextuel où l'on peut choisir d'activer l'option « toujours au-dessus » ou non. Lorsque la première application démarre, les paramètres de l'application sont lues à partir d'un fichier XML et je suis 99% que cela fonctionne comme il se doit, la propriété est TopMost lu correctement (et écrit).

Après un certain temps (minutes, heures, jours, quel que soit, je hiverne normalement et rarement arrêt) le TopMost cesse de fonctionner . Je ne change pas l'option, je ne pense pas que quelque chose est en train de changer la valeur de l'option, mais je clique sur l'icône de la zone de notification et l'application n'est pas présentée à l'avant. Il apparaît, mais il est sur le fond (il affiche sur Alt + Tab), ce n'est pas « toujours au-dessus » comme il se doit. Je afficher le menu contextuel, l'option désactiver (car il est activé) et lui permettre de retour et il commence à travailler après. L'application est maintenant « toujours au-dessus ». Cependant, il peut perdre cette capacité à tout moment après un certain temps.

Je ne comprends pas pourquoi cela se produit et comment cela se produit. Est-ce que quelqu'un a une idée pourquoi? Dans le cas contraire, aucune idée comment pourrais-je essayer de déboguer un tel comportement?

EDIT: J'ai ajouté un morceau de code pour afficher une MessageBox lorsque la propriété TopMost a été changé pour voir si je pouvais remarque un comportement étrange, mais il était pas bon. Il n'a pas aidé parce que la forme était avec TopMost = true mais il était encore en arrière-plan ...

Était-ce utile?

La solution

Il y a plus d'une fenêtre « Topmost ». Topmost dit juste "Avant toutes les fenêtres non plus hautes".

Je suis assez sûr une réinitialisation du bureau (par exemple lorsque hiberner) nécessite un autre SetWindowPos(hwnd, HWND_TOPMOST, ...) (qui est l'appel API Win32 sous-jacente).

Pour contourner ce problème, vous pouvez réinitialiser et définir la propriété à nouveau lors de l'affichage de la fenêtre.

Une autre possibilité est que cacher la fenêtre change aussi l'ordre Z -. Soit la façon dont les outils Win32 implicitement que, ou dans le WinForms explicitement appeler ainsi la fenêtre cacher / show

Autres conseils

Comme je ne Peterchen aussi ai pas la moindre idée comment obtenir la cause racine. Mais pourquoi ne pas en faire un peu plus simple?

Lorsque vous cliquez sur l'icône vous montrera votre fenêtre et compter que TopMost est toujours actif. Pourquoi ne pas appeler SetWindowPos() avec le droit de réglage actuel avant de vous montrer la fenêtre. Cela ne devrait pas faire des problèmes de performance (ne se produit que si l'utilisateur clique sur l'icône) ni aucun autre effet secondaire.

Je sais, ce serait génial de trouver la cause racine, mais peut-être il ne vaut pas si vous pouvez le résoudre avec une solution de contournement si peu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top