Ich bin jetzt seit mehreren Jahren ein .NET-Entwickler und dies ist immer noch eines der Dinge, die ich nicht richtig machen kann. Es ist einfach, ein Fenster über eine Eigenschaft in Windows Forms und WPF vor der Taskleiste auszublenden, aber soweit ich das beurteilen kann, kann dies nicht garantieren (oder sogar beeinflussen), dass es im Dialogfeld Alt+ ausgeblendet wird ↹Tab. Ich habe gesehen, dass unsichtbare Fenster in Alt+ ↹Tabangezeigt werden, und ich frage mich nur, wie ich am besten sicherstellen kann, dass ein Fenster niemals im Alt+ ↹TabDialogfeld angezeigt wird (sichtbar oder nicht) .
Update: Bitte beachten Sie meine unten stehende Lösung. Ich darf meine eigenen Antworten nicht als Lösung markieren, aber bisher ist es die einzige, die funktioniert.
Update 2: Es gibt jetzt eine richtige Lösung von Franci Penov, die ziemlich gut aussieht, sie aber nicht selbst ausprobiert hat. Enthält einige Win32, vermeidet jedoch die lahme Erstellung von Off-Screen-Fenstern.
Antworten:
Aktualisieren:
Laut @donovan unterstützt die moderne WPF dies nativ durch Setzen
ShowInTaskbar="False"
undVisibility="Hidden"
in der XAML. (Ich habe dies noch nicht getestet, aber dennoch beschlossen, die Sichtbarkeit der Kommentare zu erhöhen.)Ursprüngliche Antwort:
Es gibt zwei Möglichkeiten, ein Fenster vor dem Task-Switcher in der Win32-API auszublenden:
WS_EX_TOOLWINDOW
erweiterten Fensterstil hinzuzufügen - das ist der richtige Ansatz.Leider unterstützt WPF keine so flexible Steuerung des Fensterstils wie Win32, sodass ein Fenster
WindowStyle=ToolWindow
mit den StandardeinstellungenWS_CAPTION
undWS_SYSMENU
Stilen endet , was dazu führt, dass es eine Beschriftung und eine Schaltfläche zum Schließen hat. Auf der anderen Seite können Sie diese beiden Stile durch Festlegen entfernen. DadurchWindowStyle=None
wird jedoch derWS_EX_TOOLWINDOW
erweiterte Stil nicht festgelegt und das Fenster wird nicht vor dem Task-Umschalter ausgeblendet.Um ein WPF-Fenster zu haben
WindowStyle=None
, das auch vor dem Task-Umschalter verborgen ist, gibt es zwei Möglichkeiten:WS_EX_TOOLWINDOW
erweiterten Stil enthält.Ich persönlich bevorzuge den zweiten Ansatz. Andererseits mache ich einige fortgeschrittene Dinge wie das Erweitern des Glases im Client-Bereich und das Aktivieren des WPF-Zeichnens in der Beschriftung, sodass ein bisschen Interop kein großes Problem ist.
Hier ist der Beispielcode für den Win32-Interop-Lösungsansatz. Zunächst der XAML-Teil:
Nichts Besonderes hier, wir deklarieren nur ein Fenster mit
WindowStyle=None
undShowInTaskbar=False
. Wir fügen dem Loaded-Ereignis auch einen Handler hinzu, in dem wir den erweiterten Fensterstil ändern. Wir können diese Arbeit im Konstruktor nicht ausführen, da es zu diesem Zeitpunkt noch kein Fensterhandle gibt. Der Event-Handler selbst ist sehr einfach:Und die Win32-Interop-Deklarationen. Ich habe alle unnötigen Stile aus den Aufzählungen entfernt, um den Beispielcode hier klein zu halten. Leider befindet sich der
SetWindowLongPtr
Einstiegspunkt auch nicht in user32.dll unter Windows XP, daher der Trick beim Weiterleiten des Anrufs über dieSetWindowLong
.quelle
Fügen Sie in Ihrer Formularklasse Folgendes hinzu:
So einfach ist das; wirkt ein Zauber!
quelle
Ich habe eine Lösung gefunden, aber sie ist nicht schön. Bisher ist dies das einzige, was ich ausprobiert habe, das tatsächlich funktioniert:
Fand es hier .
Eine allgemeinere, wiederverwendbare Lösung wäre schön. Ich nehme an, Sie könnten ein einzelnes Fenster 'w' erstellen und es für alle Fenster in Ihrer App wiederverwenden, die vor dem Alt+ ausgeblendet werden müssen ↹Tab.
Update: Ok, also habe ich den obigen Code abzüglich des
this.Owner = w
Bits (undw.Hide()
unmittelbar danachw.Show()
, was gut funktioniert) in den Konstruktor meiner Anwendung verschoben und eine öffentliche StatikWindow
namens erstelltOwnerWindow
. Wann immer ich möchte, dass ein Fenster dieses Verhalten zeigt, setze ich einfachthis.Owner = App.OwnerWindow
. Funktioniert hervorragend und umfasst nur das Erstellen eines zusätzlichen (und unsichtbaren) Fensters. Sie können sogar festlegen,this.Owner = null
ob das Fenster im Dialogfeld Alt+ erneut ↹Tabangezeigt werden soll.Vielen Dank an Ivan Onuchin in den MSDN-Foren für die Lösung.
Update 2: Sie sollten auch eingestellt
ShowInTaskBar=false
auf ,w
damit er nicht kurz in der Taskleiste zu blinken , wenn gezeigt.quelle
-100000
wäre wahrscheinlich besser.Warum so komplex? Versuche dies:
Idee von hier übernommen: http://www.csharp411.com/hide-form-from-alttab/
quelle
Hier ist der Trick, unabhängig vom Stil des Fensters, vor dem Sie sich verstecken Altmöchten ↹Tab.
Fügen Sie Folgendes in den Konstruktor Ihres Formulars ein:
Im Wesentlichen machen Sie Ihr Formular zu einem untergeordneten Element eines unsichtbaren Fensters, das den richtigen Stil und die richtige ShowInTaskbar-Einstellung hat, um nicht in die Alt-Tab-Liste aufgenommen zu werden. Sie müssen auch die ShowInTaskbar-Eigenschaft Ihres eigenen Formulars auf false setzen. Das Beste ist, dass es einfach keine Rolle spielt, welchen Stil Ihr Hauptformular hat, und alle Optimierungen, um das Ausblenden zu erreichen, sind nur ein paar Zeilen im Konstruktorcode.
quelle
Warum so viele Codes ausprobieren?
FormBorderStyle
Stellen Sie einfach die Eigenschaft aufFixedToolWindow
. Ich hoffe es hilft.quelle
siehe es: (von http://bytes.com/topic/c-sharp/answers/442047-hide-alt-tab-list#post1683880 )
quelle
In XAML setze ShowInTaskbar = "False":
Bearbeiten: Das zeigt es immer noch in Alt + Tab, nur nicht in der Taskleiste.
quelle
Ich habe versucht, die Sichtbarkeit des Hauptformulars auf false zu setzen, wenn es automatisch in true geändert wird:
Es funktioniert perfekt :)
quelle
Wenn das Formular randlos sein soll, müssen Sie dem Konstruktor des Formulars die folgenden Anweisungen hinzufügen:
UND Sie müssen Ihrer abgeleiteten Formularklasse die folgende Methode hinzufügen:
mehr Details
quelle
Zeige kein Formular. Verwenden Sie Unsichtbarkeit.
Mehr hier: http://code.msdn.microsoft.com/TheNotifyIconExample
quelle
Form1-Eigenschaften:
FormBorderStyle: Sizable
WindowState: Minimiert
ShowInTaskbar: False
quelle
Persönlich, soweit ich weiß, ist dies nicht möglich, ohne sich in irgendeiner Weise in Fenster einzuhängen. Ich bin mir nicht einmal sicher, wie das gemacht werden würde oder ob es möglich ist.
Je nach Ihren Anforderungen können Sie Ihren Anwendungskontext als NotifyIcon-Anwendung (Taskleiste) ausführen, ohne dass er in ALT + TAB angezeigt wird. Wenn Sie jedoch ein Formular öffnen, folgt dieses Formular weiterhin der Standardfunktionalität.
Ich kann meinen Blog-Artikel über das Erstellen einer Anwendung lesen, die standardmäßig NUR ein NotifyIcon ist, wenn Sie möchten.
quelle