Ich verwende ein Formular, um Benachrichtigungen anzuzeigen (es wird unten rechts auf dem Bildschirm angezeigt), aber wenn ich dieses Formular anzeige, wird der Fokus vom Hauptformular gestohlen. Gibt es eine Möglichkeit, dieses "Benachrichtigungs" -Formular anzuzeigen, ohne den Fokus zu stehlen?
140
form1.Enabled = false
, um zu verhindern, dass innere Kontrollen den Fokus stehlenWS_EX_NOACTIVATE
undWS_EX_TOOLWINDOW
sind0x08000000
und0x00000080
jeweils.Aus der ShowWindow - Methode von PInvoke.net gestohlen :
(Alex Lyman antwortete darauf, ich erweitere es nur, indem ich den Code direkt einfüge. Jemand mit Bearbeitungsrechten kann ihn dort kopieren und löschen, soweit es mich interessiert;))
quelle
Wenn Sie bereit sind, Win32 P / Invoke zu verwenden , können Sie die ShowWindow- Methode verwenden (das erste Codebeispiel macht genau das, was Sie wollen).
quelle
Das hat bei mir funktioniert. Es bietet TopMost, jedoch ohne Fokus zu stehlen.
Denken Sie daran, die Einstellung von TopMost im Visual Studio-Designer oder anderswo wegzulassen.
Dies wird von hier gestohlen, ähm, ausgeliehen (klicken Sie auf Problemumgehungen):
https://connect.microsoft.com/VisualStudio/feedback/details/401311/showwithoutactivation-is-not-supported-with-topmost
quelle
Dies zu tun scheint ein Hack zu sein, aber es scheint zu funktionieren:
Bearbeiten: Beachten Sie, dass dadurch lediglich ein bereits erstelltes Formular ausgelöst wird, ohne den Fokus zu stehlen.
quelle
Der Beispielcode von pinvoke.net in den Antworten von Alex Lyman / TheSoftwareJedi macht das Fenster zu einem "obersten" Fenster, was bedeutet, dass Sie es nach dem Auftauchen nicht hinter normale Fenster stellen können. Angesichts der Beschreibung von Matias, wofür er dies verwenden möchte, könnte dies das sein, was er möchte. Wenn Sie jedoch möchten, dass der Benutzer Ihr Fenster nach dem Öffnen hinter andere Fenster stellen kann, verwenden Sie im Beispiel einfach HWND_TOP (0) anstelle von HWND_TOPMOST (-1).
quelle
In WPF können Sie es folgendermaßen lösen:
In das Fenster geben Sie diese Attribute ein:
Das letzte Attribut ist das, das Sie benötigen ShowActivated = "False".
quelle
Ich habe etwas Ähnliches und zeige einfach das Benachrichtigungsformular und mache es dann
um den Fokus wieder auf die Hauptform zu bringen.
quelle
Erstellen und starten Sie das Benachrichtigungsformular in einem separaten Thread und setzen Sie den Fokus nach dem Öffnen des Formulars wieder auf Ihr Hauptformular zurück. Lassen Sie das Benachrichtigungsformular ein OnFormOpened-Ereignis bereitstellen, das vom
Form.Shown
Ereignis ausgelöst wird . Etwas wie das:Sie können auch ein Handle für Ihr NotifcationForm-Objekt behalten, damit es vom Hauptformular programmgesteuert geschlossen werden kann (
frm.Close()
) .Einige Details fehlen, aber hoffentlich bringen Sie dies in die richtige Richtung.
quelle
Möglicherweise möchten Sie überlegen, welche Art von Benachrichtigung Sie anzeigen möchten.
Wenn es unbedingt erforderlich ist, den Benutzer über ein Ereignis zu informieren, ist die Verwendung von Messagebox.Show aufgrund seiner Natur die empfohlene Methode, um andere Ereignisse im Hauptfenster zu blockieren, bis der Benutzer dies bestätigt. Seien Sie sich jedoch der Popup-Blindheit bewusst.
Wenn dies weniger als kritisch ist, möchten Sie möglicherweise eine alternative Methode zum Anzeigen von Benachrichtigungen verwenden, z. B. eine Symbolleiste am unteren Rand des Fensters. Sie haben geschrieben, dass Sie Benachrichtigungen unten rechts auf dem Bildschirm anzeigen. Die Standardmethode hierfür ist die Verwendung einer Ballonspitze mit der Kombination eines Taskleistensymbols .
quelle
Das funktioniert gut.
Siehe: OpenIcon - MSDN und SetForegroundWindow - MSDN
quelle
Du kannst logisch damit umgehen, obwohl ich zugeben muss, dass die obigen Vorschläge, bei denen Sie eine BringToFront-Methode erhalten, ohne den Fokus zu stehlen, die elegantesten sind.
Jedenfalls bin ich darauf gestoßen und habe es mithilfe einer DateTime-Eigenschaft gelöst, um weitere BringToFront-Aufrufe nicht zuzulassen, wenn bereits kürzlich Anrufe getätigt wurden.
Angenommen, eine Kernklasse, 'Core', die beispielsweise drei Formulare, 'Form1, 2 und 3', verarbeitet. Jedes Formular benötigt eine DateTime-Eigenschaft und ein Activate-Ereignis, die Core aufrufen, um Fenster nach vorne zu bringen:
Und dann erstellen Sie die Arbeit in der Kernklasse:
Nebenbei bemerkt, wenn Sie ein minimiertes Fenster in seinen ursprünglichen Zustand zurückversetzen möchten (nicht maximiert), verwenden Sie:
Auch hier weiß ich, dass dies nur eine Patch-Lösung ist, da kein BringToFrontWithoutFocus vorhanden ist. Es ist als Vorschlag gedacht, wenn Sie die DLL-Datei vermeiden möchten.
quelle
Ich weiß nicht, ob dies als Necro-Posting angesehen wird, aber das habe ich getan, da ich es mit den Methoden "ShowWindow" und "SetWindowPos" von user32 nicht zum Laufen bringen konnte. Und nein, das Überschreiben von "ShowWithoutActivation" funktioniert in diesem Fall nicht, da das neue Fenster immer oben sein sollte. Wie auch immer, ich habe eine Hilfsmethode erstellt, die eine Form als Parameter annimmt. Wenn es aufgerufen wird, zeigt es das Formular an, bringt es nach vorne und macht es zu TopMost, ohne den Fokus des aktuellen Fensters zu stehlen (anscheinend, aber der Benutzer wird es nicht bemerken).
quelle
Ich weiß, dass es vielleicht dumm klingt, aber das hat funktioniert:
quelle
Ich musste dies mit meinem Fenster TopMost tun. Ich habe die oben beschriebene PInvoke-Methode implementiert, aber festgestellt, dass mein Load-Ereignis nicht wie oben beschrieben wurde. Es ist mir endlich gelungen. Vielleicht hilft das jemandem. Hier ist meine Lösung:
quelle
Wenn Sie ein neues Formular mit erstellen
Es stiehlt den Fokus, da Ihr Code erst im Hauptformular ausgeführt werden kann, wenn dieses Formular geschlossen ist.
Die Ausnahme besteht darin, mithilfe von Threading ein neues Formular zu erstellen und dann Form.Show (). Stellen Sie jedoch sicher, dass der Thread global sichtbar ist. Wenn Sie ihn innerhalb einer Funktion deklarieren, wird Ihr Thread beendet und das Formular verschwindet, sobald Ihre Funktion beendet wird.
quelle
Ich habe es herausgefunden :
window.WindowState = WindowState.Minimized;
.quelle