J'ai une application winforms C # qui exécute une macro dans un autre programme. L'autre programme fera continuellement apparaître des fenêtres et rendra généralement les choses folles, faute d'un meilleur mot. Je souhaite implémenter un bouton d'annulation qui arrêtera l'exécution du processus, mais je n'arrive pas à faire en sorte que la fenêtre reste au top. Comment faire cela en C #?
Edit: j'ai essayé TopMost = true; , mais l'autre programme continue d'afficher ses propres fenêtres par-dessus. Existe-t-il un moyen d'envoyer ma fenêtre vers le haut toutes les n millisecondes?
Edit: La façon dont j'ai résolu ce problème était en ajoutant une icône de la barre d'état système qui annulera le processus en double-cliquant dessus. L'icône de la barre d'état système n'est pas masquée. Merci à tous ceux qui ont répondu. J'ai lu l'article expliquant pourquoi il n'y a pas de fenêtre «super-dessus» ... cela ne fonctionne logiquement pas.
Réponses:
Form.TopMost
fonctionnera à moins que l'autre programme crée les fenêtres les plus hautes.Il n'existe aucun moyen de créer une fenêtre qui n'est pas couverte par les nouvelles fenêtres supérieures d'un autre processus. Raymond Chen a expliqué pourquoi.
la source
Form.ActiveForm.TopMost
Je cherchais à faire de mon application WinForms "Always on Top" mais le réglage "TopMost" n'a rien fait pour moi. Je savais que c'était possible parce que WinAmp fait cela (avec une foule d'autres applications).
Ce que j'ai fait, c'est d'appeler "user32.dll". Je n'ai eu aucun scrupule à le faire et cela fonctionne très bien. C'est une option, de toute façon.
Tout d'abord, importez l'espace de noms suivant:
Ajoutez quelques variables à votre déclaration de classe:
Ajouter un prototype pour la fonction user32.dll:
Puis dans votre code (j'ai ajouté l'appel dans Form_Load ()), ajoutez l'appel:
J'espère que cela pourra aider. Référence
la source
Si par "devenir fou" vous voulez dire que chaque fenêtre continue de voler le focus de l'autre, TopMost ne résoudra pas le problème.
Essayez plutôt:
Cela montrera la forme «enfant» sans qu'elle vole l'attention. Le formulaire enfant restera également au-dessus de son parent même si le parent est activé ou focalisé. Ce code ne fonctionne facilement que si vous avez créé une instance du formulaire enfant à partir du formulaire propriétaire. Sinon, vous devrez peut-être définir le propriétaire à l'aide de l'API.
la source
CalledForm.Owner
à lui-même (CalledForm
) provoquera unSystem.ArgumentException
: 'Une référence de contrôle circulaire a été faite. Un contrôle ne peut pas être possédé par lui-même ni être parent. ''Définir Form.TopMost
la source
J'ai eu un laps de temps momentané de 5 minutes et j'ai oublié de spécifier le formulaire en entier comme ceci:
Mais ce que je voulais vraiment, c'était CECI!
la source
Définissez la
.TopMost
propriété du formulaire sur true.Vous ne voulez probablement pas le laisser de cette façon tout le temps: définissez-le lorsque votre processus externe démarre et remettez-le lorsqu'il se termine.
la source
La façon dont j'ai résolu ce problème était de créer une icône de la barre d'état système avec une option d'annulation.
la source
Le code suivant permet à la fenêtre de toujours rester en haut et de la rendre sans cadre.
la source
Quelle est l'autre application dont vous essayez de supprimer la visibilité? Avez-vous étudié d'autres moyens d'obtenir l'effet souhaité? Veuillez le faire avant de soumettre vos utilisateurs à un comportement malveillant tel que vous le décrivez: ce que vous essayez de faire ressemble plutôt à ce que certains sites méchants font avec les fenêtres de navigateur ...
Au moins, essayez de respecter la règle de la moindre surprise . Les utilisateurs s'attendent à pouvoir déterminer eux-mêmes l'ordre z de la plupart des applications. Vous ne savez pas ce qui est le plus important pour eux, donc si vous changez quoi que ce soit, vous devriez vous concentrer sur le fait de pousser l'autre application derrière tout plutôt que de promouvoir la vôtre.
Ceci est bien sûr plus délicat, car Windows ne dispose pas d'un gestionnaire de fenêtres particulièrement sophistiqué. Deux approches se suggèrent:
la source
Pourquoi ne pas faire de votre formulaire une boîte de dialogue:
la source
TopMost = true
forcé mon formulaire au-dessus de tout, y compris le chrome, alors qu'en réalité, ce n'est qu'une boîte de paramètres et j'en avais besoin au-dessus du formulaire principal. Félicitations à votre internaute.Voici l'équivalent de SetForegroundWindow:
J'ai vu des gens faire des choses bizarres comme:
http://blog.jorgearimany.com/2010/10/win32-setforegroundwindow-equivalent-in.html
la source
this.Show(); this.Activate(); this.BringToFront();
mais cette réponse nous a amenés à cette solution. Merci!Je sais que c'est vieux, mais je n'ai pas vu cette réponse.
Dans la fenêtre (xaml) ajoutez:
Dans le code derrière pour Window_Deactivated:
Cela gardera votre fenêtre au top.
la source
Sur la base de la réponse de clamum et du commentaire de Kevin Vuilleumier sur l'autre drapeau responsable du comportement, j'ai fait cette bascule qui bascule entre en haut et pas en haut en appuyant sur un bouton.
la source