122 votes

Comment faire pour qu'une fenêtre reste toujours au top dans .Net?

J'ai un C#, winforms application qui exécute une macro dans un autre programme. L'autre programme n'aura de cesse de fenêtres pop-up et généralement faire voir les choses, par manque d'un meilleur mot, fou. Je veux implémenter un bouton annuler qui arrêtera le processus de l'exécution, mais je n'arrive pas à obtenir la fenêtre de rester au top. Comment puis-je le faire en C#?

Edit: j'ai essayé de niveau Supérieur=true; , mais de l'autre programme continue à sauter de son propre windows sur le dessus. Est-il possible d'envoyer ma fenêtre vers le haut toutes les n millisecondes?

Edit: j'ai résolu ce fut par l'ajout d'une icône de plateau de système qui va annuler le processus en double-cliquant dessus. L'icône de plateau de système n'a pas de couverts. Merci à tous ceux qui ont répondu. J'ai lu l'article sur pourquoi il n'y a pas un " super-dessus de la fenêtre... logiquement, il ne fonctionne pas.

206voto

RossFabricant Points 7745

Form.TopMost fonctionnera à moins que l'autre programme ne crée les plus hautes fenêtres.

Il n'y a aucun moyen de créer une fenêtre qui n'est pas couverte par les nouvelles fenêtres les plus hautes d'un autre processus. Raymond Chen a expliqué pourquoi.

24voto

Victor Stoddard Points 158

Si par "fou" vous voulez dire que chaque fenêtre tient à voler à partir de l'autre, de niveau Supérieur ne va pas résoudre le problème.

Au lieu de cela, essayez:

CalledForm.Owner = CallerForm;
CalledForm.Show();

Cela permettra de montrer "l'enfant" forme sans lui voler le focus. L'enfant du formulaire permet également de rester au top de sa mère, même si le parent est activé ou concentré. Ce code ne fonctionne que si vous avez créé une instance de l'enfant forme de l'intérieur de la propriétaire de forme. Sinon, vous pourriez avoir à régler au propriétaire à l'aide de l'API.

18voto

Reed Copsey Points 315315

Définir Form.TopMost

9voto

Joel Coehoorn Points 190579

Définissez la propriété .TopMost du formulaire sur true.

Vous ne voulez probablement pas le laisser ainsi tout le temps: définissez-le lorsque votre processus externe démarre et remettez-le à la fin.

3voto

Pontus Gagge Points 12950

Qu'est-ce que l'autre demande que vous essayez de supprimer la visibilité de l'? Avez-vous cherché d'autres moyens d'atteindre l'effet désiré? Veuillez le faire avant de soumettre vos utilisateurs à ces voyous de comportement que vous décrivez: ce que vous essayez de faire de son plutôt comme ce que certaines coquine sites avec le navigateur de windows...

Essayez au moins de respecter la règle des Moins de Surprise. Les utilisateurs s'attendent à être en mesure de déterminer l'ordre z de la plupart des applications elles-mêmes. Vous ne savez pas ce qui est le plus important pour eux, donc si vous changez quelque chose, vous devriez vous concentrer sur poussant l'autre application derrière tout plutôt que la promotion de votre propre.

Bien sûr, cela est plus délicat, car Windows n'a pas particulièrement sophistiquée gestionnaire de fenêtre. Deux approches se dégagent:

  1. l'énumération des fenêtres de niveau supérieur et la vérification des processus auxquels ils appartenir à, laissant tomber leurs z-pour le cas échéant. (Je ne suis pas sûr si il y a des cadre des méthodes pour ces WinAPI fonctions.)
  2. Bricoler avec les enfants des autorisations de traitement pour l'empêcher d'accéder à l'ordinateur de bureau... mais je ne voudrais pas essayer jusqu'à ce que les autre approche a échoué, comme le processus de l'enfant pourrait se retrouver dans un état zombie tout en nécessitant une interaction avec l'utilisateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X