Je suis développeur .NET depuis plusieurs années maintenant et c'est toujours une de ces choses que je ne sais pas faire correctement. Il est facile de masquer une fenêtre de la barre des tâches via une propriété dans Windows Forms et WPF, mais pour autant que je sache, cela ne garantit pas (ou n'affecte pas nécessairement) qu'elle soit cachée de la boîte de dialogue Alt+ ↹Tab. J'ai vu des fenêtres invisibles apparaître dans Alt+ ↹Tab, et je me demande simplement quel est le meilleur moyen de garantir qu'une fenêtre n'apparaîtra jamais (visible ou non) dans la boîte de dialogue Alt+ ↹Tab.
Mise à jour: veuillez voir ma solution publiée ci-dessous. Je ne suis pas autorisé à marquer mes propres réponses comme la solution, mais jusqu'à présent, c'est la seule qui fonctionne.
Mise à jour 2: Il existe maintenant une solution appropriée de Franci Penov qui semble plutôt bonne, mais je ne l'ai pas essayée moi-même. Implique certains Win32, mais évite la création boiteuse de fenêtres hors écran.
Réponses:
Mettre à jour:
Selon @donovan, WPF moderne prend en charge cela de manière native, via la configuration
ShowInTaskbar="False"
etVisibility="Hidden"
dans le XAML. (Je n'ai pas encore testé cela, mais j'ai néanmoins décidé d'augmenter la visibilité des commentaires)Réponse originale:
Il existe deux façons de masquer une fenêtre du sélecteur de tâches dans l'API Win32:
WS_EX_TOOLWINDOW
style de fenêtre étendu - c'est la bonne approche.Malheureusement, WPF ne prend pas en charge un contrôle aussi flexible sur le style de fenêtre que Win32, donc une fenêtre avec
WindowStyle=ToolWindow
se termine avec la valeur par défautWS_CAPTION
et lesWS_SYSMENU
styles, ce qui lui donne une légende et un bouton de fermeture. D'un autre côté, vous pouvez supprimer ces deux styles en définissantWindowStyle=None
, mais cela ne définira pas leWS_EX_TOOLWINDOW
style étendu et la fenêtre ne sera pas masquée du sélecteur de tâches.Pour avoir une fenêtre WPF avec
WindowStyle=None
qui est également masquée dans le sélecteur de tâches, vous pouvez de deux manières:WS_EX_TOOLWINDOW
style étendu.Personnellement, je préfère la deuxième approche. Là encore, je fais des choses avancées comme étendre la vitre dans la zone client et activer le dessin WPF dans la légende de toute façon, donc un peu d'interopérabilité n'est pas un gros problème.
Voici l'exemple de code pour l'approche de solution d'interopérabilité Win32. Tout d'abord, la partie XAML:
Rien d'extraordinaire ici, nous déclarons simplement une fenêtre avec
WindowStyle=None
etShowInTaskbar=False
. Nous ajoutons également un gestionnaire à l'événement Loaded où nous modifierons le style de fenêtre étendu. Nous ne pouvons pas faire ce travail dans le constructeur, car il n'y a pas encore de handle de fenêtre à ce stade. Le gestionnaire d'événements lui-même est très simple:Et les déclarations d'interopérabilité Win32. J'ai supprimé tous les styles inutiles des énumérations, juste pour garder l'exemple de code ici petit. De plus, malheureusement, le
SetWindowLongPtr
point d'entrée ne se trouve pas dans user32.dll sous Windows XP, d'où l'astuce consistant à acheminer l'appel via leSetWindowLong
.la source
Dans votre classe de formulaire, ajoutez ceci:
C'est aussi simple que ça; fonctionne un charme!
la source
J'ai trouvé une solution, mais ce n'est pas joli. Jusqu'à présent, c'est la seule chose que j'ai essayée qui fonctionne réellement:
Je l'ai trouvé ici .
Une solution plus générale et réutilisable serait bien. Je suppose que vous pouvez créer une seule fenêtre «w» et la réutiliser pour toutes les fenêtres de votre application qui doivent être masquées par le Alt+ ↹Tab.
Mise à jour: Ok, donc ce que j'ai fait a été de déplacer le code ci-dessus, moins le
this.Owner = w
bit (et de le déplacerw.Hide()
immédiatement aprèsw.Show()
, ce qui fonctionne bien) dans le constructeur de mon application, en créant une statique publiqueWindow
appeléeOwnerWindow
. Chaque fois que je veux qu'une fenêtre présente ce comportement, je définis simplementthis.Owner = App.OwnerWindow
. Fonctionne très bien et n'implique que la création d'une fenêtre supplémentaire (et invisible). Vous pouvez même définirthis.Owner = null
si vous souhaitez que la fenêtre réapparaisse dans la boîte de dialogue Alt+ ↹Tab.Merci à Ivan Onuchin sur les forums MSDN pour la solution.
Mise à jour 2: Vous devriez également mettre
ShowInTaskBar=false
surw
pour l' empêcher de clignoter brièvement dans la barre des tâches lorsque indiqué.la source
-100000
serait probablement mieux.Pourquoi si complexe? Essaye ça:
Idée tirée d'ici: http://www.csharp411.com/hide-form-from-alttab/
la source
Voici ce qui fait l'affaire, quel que soit le style de la fenêtre à laquelle vous essayez de vous cacher Alt+ ↹Tab.
Placez ce qui suit dans le constructeur de votre formulaire:
Essentiellement, vous faites de votre formulaire un enfant d'une fenêtre invisible qui a le style et le paramètre ShowInTaskbar corrects pour rester en dehors de la liste Alt-Tab. Vous devez également définir la propriété ShowInTaskbar de votre propre formulaire sur false. Mieux encore, peu importe le style de votre formulaire principal, et toutes les modifications pour accomplir le masquage ne sont que quelques lignes dans le code du constructeur.
la source
Pourquoi essayer autant de codes?
FormBorderStyle
Réglez simplement la propriété surFixedToolWindow
. J'espère que ça aide.la source
voir: (depuis http://bytes.com/topic/c-sharp/answers/442047-hide-alt-tab-list#post1683880 )
la source
En XAML, définissez ShowInTaskbar = "False":
Edit: Cela le montre toujours dans Alt + Tab, je suppose, mais pas dans la barre des tâches.
la source
J'ai essayé de définir la visibilité du formulaire principal sur false chaque fois qu'il est automatiquement changé en true:
Cela fonctionne parfaitement :)
la source
si vous souhaitez que le formulaire soit sans bordure, vous devez ajouter les instructions suivantes au constructeur du formulaire:
ET vous devez ajouter la méthode suivante à votre classe Form dérivée:
plus de détails
la source
Ne montrez pas de formulaire. Utilisez l'invisibilité.
Plus ici: http://code.msdn.microsoft.com/TheNotifyIconExample
la source
Propriétés Form1:
FormBorderStyle: Sizable
WindowState: Minimized
ShowInTaskbar: False
la source
Personnellement, pour autant que je sache, cela n'est pas possible sans accrocher les fenêtres d'une manière ou d'une autre, je ne sais même pas comment cela serait fait ou si cela est possible.
Selon vos besoins, le développement de votre contexte d'application en tant qu'application NotifyIcon (barre d'état système) lui permettra de s'exécuter sans s'afficher dans ALT + TAB. CEPENDANT, si vous ouvrez un formulaire, ce formulaire suivra toujours la fonctionnalité standard.
Je peux consulter mon article de blog sur la création d'une application qui est UNIQUEMENT un NotifyIcon par défaut si vous le souhaitez.
la source