Ich habe eine C # Winforms-App, die ein Makro in einem anderen Programm ausführt. Das andere Programm öffnet ständig Fenster und lässt die Dinge im Allgemeinen, mangels eines besseren Wortes, verrückt aussehen. Ich möchte eine Schaltfläche zum Abbrechen implementieren, die die Ausführung des Prozesses stoppt, aber ich kann anscheinend nicht das Fenster so einstellen, dass es oben bleibt. Wie mache ich das in C #?
Bearbeiten: Ich habe versucht, TopMost = true; , aber das andere Programm öffnet immer wieder seine eigenen Fenster. Gibt es eine Möglichkeit, mein Fenster alle n Millisekunden nach oben zu senden?
Bearbeiten: Ich habe dieses Problem gelöst, indem ich ein Taskleistensymbol hinzugefügt habe, das den Vorgang durch Doppelklick abbricht. Das Taskleistensymbol wird nicht verdeckt. Vielen Dank an alle, die geantwortet haben. Ich habe den Artikel darüber gelesen, warum es kein "Super-on-Top" -Fenster gibt ... es funktioniert logischerweise nicht.
Antworten:
Form.TopMost
funktioniert nur, wenn das andere Programm die obersten Fenster erstellt.Es gibt keine Möglichkeit, ein Fenster zu erstellen, das nicht von neuen obersten Fenstern eines anderen Prozesses abgedeckt wird. Raymond Chen erklärte warum.
quelle
Form.ActiveForm.TopMost
Ich habe versucht, meine WinForms-Anwendung auf "Immer oben" zu setzen, aber die Einstellung "TopMost" hat nichts für mich getan. Ich wusste, dass es möglich war, weil WinAmp dies tut (zusammen mit einer Vielzahl anderer Anwendungen).
Ich habe "user32.dll" angerufen. Ich hatte keine Bedenken und es funktioniert großartig. Es ist sowieso eine Option.
Importieren Sie zunächst den folgenden Namespace:
Fügen Sie Ihrer Klassendeklaration einige Variablen hinzu:
Prototyp für die Funktion user32.dll hinzufügen:
Fügen Sie dann in Ihrem Code (ich habe den Aufruf in Form_Load () hinzugefügt) den Aufruf hinzu:
Hoffentlich hilft das. Referenz
quelle
Wenn Sie mit "verrückt werden" meinen, dass jedes Fenster dem anderen den Fokus stiehlt, wird TopMost das Problem nicht lösen.
Versuchen Sie stattdessen:
Dies zeigt die 'Kind'-Form, ohne dass sie den Fokus stiehlt. Das untergeordnete Formular bleibt auch dann über dem übergeordneten Formular, wenn das übergeordnete Element aktiviert oder fokussiert ist. Dieser Code funktioniert nur dann problemlos, wenn Sie eine Instanz des untergeordneten Formulars aus dem Eigentümerformular heraus erstellt haben. Andernfalls müssen Sie den Eigentümer möglicherweise über die API festlegen.
quelle
CalledForm.Owner
auf sich selbst (CalledForm
) führt zu folgenden ErgebnissenSystem.ArgumentException
: 'Es wurde eine Zirkelsteuerungsreferenz erstellt. Ein Steuerelement kann nicht im Besitz oder für sich selbst sein. 'Stellen Sie Form.TopMost ein
quelle
Ich hatte eine kurze Zeitspanne von 5 Minuten und habe vergessen, das Formular vollständig wie folgt anzugeben:
Aber was ich wirklich wollte, war DIESES!
quelle
Setzen Sie die
.TopMost
Eigenschaft des Formulars auf true.Sie möchten es wahrscheinlich nicht die ganze Zeit so lassen: Stellen Sie es ein, wenn Ihr externer Prozess beginnt, und legen Sie es zurück, wenn es beendet ist.
quelle
Ich habe dies gelöst, indem ich ein Taskleistensymbol mit einer Abbruchoption erstellt habe.
quelle
Mit dem folgenden Code bleibt das Fenster immer oben und rahmenlos.
quelle
Was ist die andere Anwendung, deren Sichtbarkeit Sie unterdrücken möchten? Haben Sie andere Möglichkeiten untersucht, um den gewünschten Effekt zu erzielen? Bitte tun Sie dies, bevor Sie Ihre Benutzer einem solchen Schurkenverhalten aussetzen, wie Sie es beschreiben: Was Sie versuchen zu tun, klingt eher so, wie bestimmte ungezogene Websites mit Browserfenstern tun ...
Versuchen Sie zumindest, sich an die Regel der geringsten Überraschung zu halten . Benutzer erwarten, dass sie die Z-Reihenfolge der meisten Anwendungen selbst bestimmen können. Sie wissen nicht, was für sie am wichtigsten ist. Wenn Sie also etwas ändern, sollten Sie sich darauf konzentrieren, die andere Anwendung hinter alles zu stellen, anstatt Ihre eigene zu bewerben.
Dies ist natürlich schwieriger, da Windows keinen besonders ausgeklügelten Fenstermanager hat. Zwei Ansätze bieten sich an:
quelle
Warum machen Sie Ihr Formular nicht zu einem Dialogfeld:
quelle
TopMost = true
zwang mein Formular über alles, einschließlich Chrom, wenn es in Wirklichkeit nur ein Einstellungsfeld ist und ich es über dem Hauptformular brauchte. Ein großes Lob an Sie Internet-Person.Hier ist das SetForegroundWindow-Äquivalent:
Ich habe Leute gesehen, die seltsame Dinge taten wie:
http://blog.jorgearimany.com/2010/10/win32-setforegroundwindow-equivalent-in.html
quelle
this.Show(); this.Activate(); this.BringToFront();
Aber diese Antwort brachte uns zu dieser Lösung. Vielen Dank!Ich weiß, dass dies alt ist, aber ich habe diese Antwort nicht gesehen.
Fügen Sie im Fenster (xaml) Folgendes hinzu:
Im Code dahinter für Window_Deactivated:
Dadurch bleibt Ihr Fenster oben.
quelle
Basierend auf der Antwort von Clamum und Kevin Vuilleumiers Kommentar zu der anderen Flagge, die für das Verhalten verantwortlich ist, habe ich diesen Schalter gemacht, der per Knopfdruck zwischen oben und nicht oben wechselt .
quelle