Einzelformular beim Start ausblenden

75

Ich habe eine Anwendung mit einem Formular darin, und bei der Lademethode muss ich das Formular ausblenden.

Das Formular wird von selbst angezeigt, wenn dies erforderlich ist (denken Sie an ein Popup im Outlook 2003-Stil), aber ich kann herausfinden, wie das Formular beim Laden ausgeblendet werden kann, ohne dass etwas Unordentliches auftritt.

Irgendwelche Vorschläge?

Pondidum
quelle

Antworten:

110

Ich komme dazu von C #, sollte aber in vb.net sehr ähnlich sein.

In Ihrer Hauptprogrammdatei haben Sie in der Main-Methode Folgendes:

Application.Run(new MainForm());

Dadurch wird ein neues Hauptformular erstellt und die Lebensdauer der Anwendung auf die Lebensdauer des Hauptformulars begrenzt.

Wenn Sie jedoch den Parameter in Application.Run () entfernen, wird die Anwendung ohne angezeigtes Formular gestartet und Sie können Formulare beliebig oft ein- und ausblenden.

Initialisieren Sie das Formular, bevor Sie Application.Run () aufrufen, anstatt das Formular in der Load-Methode auszublenden. Ich gehe davon aus, dass das Formular ein NotifyIcon enthält, um ein Symbol in der Taskleiste anzuzeigen. Dies kann auch dann angezeigt werden, wenn das Formular selbst noch nicht sichtbar ist. Durch Aufrufen Form.Show()oder Form.Hide()von Handlern von NotifyIcon-Ereignissen wird das Formular angezeigt bzw. ausgeblendet.

Grokys
quelle
13
Mit Abstand die besten (und eine der einfachsten) Lösungen, die ich je gesehen habe. Der gesamte Müll über das Setzen der Deckkraft auf Null, separate Timer-Instanzen zum Ausblenden des Formulars usw. riecht tagelang nach Code.
Nathanchere
Wird es mit dieser Methode immer noch von Process.MainWindowHandleund dergleichen gefunden?
Sebastian
13
Der Designer hat meines Erachtens keine Visible-Eigenschaft.
Dan W
5
Visual Studio 2015 und .NET 4.5 hier ... Designer hat keine visibleEigenschaft für Formulare. Übersehe ich etwas?
Ben Philipp
1
Korrigieren Sie mich, wenn ich falsch liege. Der Application.Run stellt dem Prozess eine Nachrichtenschleife zur Verfügung, die für Windows Forms benötigt wird. Ohne sie stürzt Ihr Code in Ihrem Formular ab.
Manit
104

Normalerweise tun Sie dies nur, wenn Sie ein Taskleistensymbol oder eine andere Methode verwenden, um das Formular später anzuzeigen. Dies funktioniert jedoch auch dann gut, wenn Sie Ihr Hauptformular nie anzeigen.

Erstellen Sie in Ihrer Formularklasse einen Bool, der standardmäßig auf false gesetzt ist:

private bool allowshowdisplay = false;

Überschreiben Sie dann die SetVisibleCore-Methode

protected override void SetVisibleCore(bool value)
{            
    base.SetVisibleCore(allowshowdisplay ? value : allowshowdisplay);
}

Da Application.Run () die Formulare festlegt .Visible = true, nachdem das Formular geladen wurde, wird dies abgefangen und auf false gesetzt. Im obigen Fall wird es immer auf false gesetzt, bis Sie es aktivieren, indem Sie allowhowdisplay auf true setzen.

Damit das Formular beim Start nicht mehr angezeigt wird, müssen Sie SetVisibleCore erneut aktivieren, damit es ordnungsgemäß funktioniert, indem Sie allowhowdisplay = true festlegen. Sie sollten dies für jede Benutzeroberflächenfunktion tun, die das Formular anzeigt. In meinem Beispiel ist es das Linksklick-Ereignis in meinem Notiyicon-Objekt:

private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        this.allowshowdisplay = true;
        this.Visible = !this.Visible;                
    }
}
Paul Aicher
quelle
2
Vielen Dank! Im Gegensatz zu fast allen anderen Vorschlägen hier zeigt dieser KEINEN kurzen Blitz des Hauptfensters.
Andy
2
Dies ist der tatsächlich richtige Weg, dies zu tun, daher sollte es die akzeptierte Antwort sein. In den MFC-Tagen haben wir eine ähnliche Sache gemacht, bei der wir die erste WM_WINDOWPOSCHANGING-Nachricht verarbeitet und das Formular dort ausgeblendet haben, um ein "Fensterblinken" zu verhindern.
Enriquein
Vielen Dank, ich habe die akzeptierte Antwort ausprobiert und es hat nicht funktioniert, da ich ein Tray-Symbol anzeigen muss. Dies hat jedoch perfekt funktioniert.
Omar Kooheji
Das funktioniert, aber ich denke, @ Jeffs Antwort ist besser, da es keine Überschreibung mit logischem Hacking erfordert.
Mark Lakata
1
Leider wird das Benachrichtigungssymbol überhaupt nicht angezeigt, wenn ich die SetVisibleCore () -Methode zum Formular hinzufüge, sodass ich sie anschließend nicht mit einem Mausklick anzeigen kann.
Dan W
34

Ich benutze das:

private void MainForm_Load(object sender, EventArgs e)
{
    if (Settings.Instance.HideAtStartup)
    {
        BeginInvoke(new MethodInvoker(delegate
        {
            Hide();
        }));
    }
}

Natürlich müssen Sie die if-Bedingung mit Ihrer ändern.

Matías
quelle
2
Dies führt dazu, dass das Programm blinkt und sich beim Start schnell versteckt.
Dan W
Ich denke, ich sollte so viel tun, wenn ich Ihren Code nicht sehen würde. Danke
M am
Um den Flash beim Start der App zu beheben, setzen Sie die Formopazität im Designer auf 0, rufen Sie dann im Rückruf zuerst Hide () auf und setzen Sie die Opazität dann wieder auf 100.
Michael Bray
20
    protected override void OnLoad(EventArgs e)
    {
        Visible = false; // Hide form window.
        ShowInTaskbar = false; // Remove from taskbar.
        Opacity = 0;

        base.OnLoad(e);
    }
Chriz
quelle
1
Ich möchte, dass mein Formular ausgeblendet wird, ABER noch geladen ist und ausgeführt wird. Diese Lösung funktioniert in diesem Fall einwandfrei. Upvote zu dir!
Joe Gayetty
Ich denke, das ist die beste Lösung, THX :)
Soheyl
15

Zur Formularerstellungszeit (Designer, Programm Main oder Formularkonstruktor, abhängig von Ihren Zielen),

 this.WindowState = FormWindowState.Minimized;
 this.ShowInTaskbar = false;

Wenn Sie das Formular anzeigen müssen, vermutlich bei einem Ereignis von Ihrem NotifyIcon, kehren Sie es nach Bedarf um.

 if (!this.ShowInTaskbar)
    this.ShowInTaskbar = true;

 if (this.WindowState == FormWindowState.Minimized)
    this.WindowState = FormWindowState.Normal;

Aufeinanderfolgende Ereignisse zum Ein- und Ausblenden können einfacher die Visible-Eigenschaft des Formulars oder die Show / Hide-Methoden verwenden.

Jeff
quelle
Dies funktioniert auch im Load-Ereignis. Ich denke, so war es beabsichtigt.
Mark Lakata
5

Versuchen Sie, die App auch in der Taskleiste auszublenden.

Verwenden Sie dazu bitte diesen Code.

  protected override void OnLoad(EventArgs e)
  {
   Visible = false; // Hide form window.
   ShowInTaskbar = false; // Remove from taskbar.
   Opacity = 0;

   base.OnLoad(e);
   }

Vielen Dank. Ruhul

Metallisches Skelett
quelle
4

Erweitern Sie Ihr Hauptformular mit diesem:

using System.Windows.Forms;

namespace HideWindows
{
    public class HideForm : Form
    {
        public HideForm()
        {
            Opacity = 0;
            ShowInTaskbar = false;
        }

        public new void Show()
        {
            Opacity = 100;
            ShowInTaskbar = true;

            Show(this);
        }
    }
}

Zum Beispiel:

namespace HideWindows
{
    public partial class Form1 : HideForm
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}

Weitere Infos in diesem Artikel (Spanisch):

http://codelogik.net/2008/12/30/primer-form-oculto/


quelle
1
Website ist außer Betrieb.
Cocoa Dev
3

Ich habe viel mit diesem Problem zu kämpfen und die Lösung ist viel einfacher als ich. Ich habe zuerst alle Vorschläge hier ausprobiert, war dann aber mit dem Ergebnis nicht zufrieden und habe es etwas genauer untersucht. Ich fand das, wenn ich Folgendes hinzufüge:

 this.visible=false;
 /* to the InitializeComponent() code just before the */
 this.Load += new System.EventHandler(this.DebugOnOff_Load);

Es funktioniert gut. aber ich wollte eine einfachere Lösung und es stellt sich heraus, dass, wenn Sie Folgendes hinzufügen:

this.visible=false;
/* to the start of the load event, you get a
simple perfect working solution :) */ 
private void
DebugOnOff_Load(object sender, EventArgs e)
{
this.Visible = false;
}
echoen
quelle
3

Sie möchten den Fensterstatus auf minimiert setzen und in der Taskleiste auf false anzeigen. Laden Sie dann am Ende Ihres Formulars den Fensterstatus auf Maximieren und zeigen Sie ihn in der Taskleiste auf true an

    public frmMain()
    {
        Program.MainForm = this;
        InitializeComponent();

        this.WindowState = FormWindowState.Minimized;
        this.ShowInTaskbar = false;
    }

private void frmMain_Load(object sender, EventArgs e)
    {
        //Do heavy things here

        //At the end do this
        this.WindowState = FormWindowState.Maximized;
        this.ShowInTaskbar = true;
    }
George
quelle
3

Fügen Sie dies in Ihre Program.cs ein:

FormName FormName = new FormName ();

FormName.ShowInTaskbar = false;
FormName.Opacity = 0;
FormName.Show();
FormName.Hide();

Verwenden Sie diese Option, wenn Sie das Formular anzeigen möchten:

var principalForm = Application.OpenForms.OfType<FormName>().Single();
principalForm.ShowInTaskbar = true;
principalForm.Opacity = 100;
principalForm.Show();
Pest
quelle
1

OnVisibleChanged in Form überschreiben

protected override void OnVisibleChanged(EventArgs e)
{
    this.Visible = false;

    base.OnVisibleChanged(e);
}

Sie können einen Trigger hinzufügen, wenn Sie ihn irgendwann anzeigen müssen

public partial class MainForm : Form
{
public bool hideForm = true;
...
public MainForm (bool hideForm)
    {
        this.hideForm = hideForm;
        InitializeComponent();
    }
...
protected override void OnVisibleChanged(EventArgs e)
    {
        if (this.hideForm)
            this.Visible = false;

        base.OnVisibleChanged(e);
    }
...
}
LKane
quelle
0

Hier ist ein einfacher Ansatz:
Es ist in C # (ich habe momentan keinen VB-Compiler)

public Form1()
{
    InitializeComponent();
    Hide(); // Also Visible = false can be used
}

private void Form1_Load(object sender, EventArgs e)
{
    Thread.Sleep(10000);
    Show(); // Or visible = true;
}
aku
quelle
Wenn Sie die Show Line nicht in Form1_Load hinzufügen, wird das Formular trotzdem angezeigt, auch wenn Sie sichtbar auf false gesetzt haben ... -1
Eugenio Miró
1
-1 Das funktioniert nicht. Application.Run () verschwört sich gegen Sie, um das Formular zu zeigen, egal was passiert.
Mark Lakata
0

Wenn Sie eine App ohne Formular starten, müssen Sie den Start / Herunterfahren der Anwendung selbst verwalten.

Das unsichtbare Starten des Formulars ist eine bessere Option.

Roger Willcocks
quelle
0

Dieses Beispiel unterstützt die vollständige Unsichtbarkeit sowie nur NotifyIcon in der Taskleiste und keine Klicks und vieles mehr.

Mehr hier: http://code.msdn.microsoft.com/TheNotifyIconExample

TheUberOverLord
quelle
Leider existiert dieser Inhalt nicht mehr: /
Spikolynn
0

Als Ergänzung zu Grokys Antwort (die aus meiner Sicht bei weitem die beste Antwort ist) könnten wir auch die ApplicationContext- Klasse erwähnen , die auch (wie im Beispiel des Artikels gezeigt) die Möglichkeit bietet, zwei (oder sogar mehr) Formulare zu öffnen beim Steuern der Anwendung und steuern Sie mit allen die Lebensdauer der Anwendung.

Eugenio Miró
quelle
0
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    MainUIForm mainUiForm = new MainUIForm();
    mainUiForm.Visible = false;
    Application.Run();
}
Kilsek
quelle
0

Das funktioniert perfekt für mich:

[STAThread]
    static void Main()
    {
        try
        {
            frmBase frm = new frmBase();               
            Application.Run();
        }

Beim Starten des Projekts wurde alles ausgeblendet, auch in der Taskleiste, es sei denn, ich muss es anzeigen.

Willy David Jr.
quelle
0

Ich hatte ein Problem ähnlich dem des Posters, bei dem der Code zum Ausblenden des Formulars im Ereignis form_Load ausgelöst wurde, bevor das Formular vollständig geladen wurde, wodurch die Hide () -Methode fehlschlug (nicht abstürzte, nur nicht wie erwartet funktionierte).

Die anderen Antworten sind großartig und funktionieren, aber ich habe festgestellt, dass das form_Load-Ereignis im Allgemeinen häufig solche Probleme aufweist und das, was Sie dort einfügen möchten, problemlos in den Konstruktor oder das form_Shown-Ereignis übernommen werden kann.

Wie auch immer, wenn ich denselben Code verschoben habe, der einige Dinge überprüft, und dann das Formular versteckt, wenn es nicht benötigt wird (ein Anmeldeformular, wenn die einmalige Anmeldung fehlschlägt), hat es wie erwartet funktioniert.

blinder Skwirl
quelle
0
    static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 form1 = new Form1();
            form1.Visible = false;
            Application.Run();

        }
 private void ExitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
            Application.Exit();
        }
Muhammad Rashed Nadeem
quelle
-1

Setzen Sie im Designer die Visible-Eigenschaft des Formulars auf false. Vermeiden Sie es dann, Show () aufzurufen, bis Sie es brauchen.

Ein besseres Paradigma besteht darin, eine Instanz des Formulars erst zu erstellen, wenn Sie es benötigen.

Deemer
quelle
-2

Warum ist das überhaupt so?

Warum nicht einfach wie eine Konsolen-App starten und das Formular bei Bedarf anzeigen? Es gibt nur ein paar Referenzen, die eine Konsolen-App von einer Formular-App trennen.

Sie müssen nicht gierig sein und den für das Formular erforderlichen Speicher nehmen, wenn Sie ihn möglicherweise nicht einmal benötigen.

Benjamin Autin
quelle
-2

Aufgrund verschiedener Vorschläge musste ich nur Folgendes tun:

So verstecken Sie das Formular:

Me.Opacity = 0
Me.ShowInTaskbar = false

So zeigen Sie das Formular an:

Me.Opacity = 100
Me.ShowInTaskbar = true
Jon Onstott
quelle
Was passiert, wenn der Benutzer versehentlich eine Eingabetaste drückt oder in den transparenten Bereich tippt? Ich denke, du solltest mich auch tun. Enable = false;
Angshuman Agarwal
-2

Ich mache es so - aus meiner Sicht der einfachste Weg:

Setzen Sie die 'StartPosition' des Formulars auf 'Manuell' und fügen Sie diese dem Designer des Formulars hinzu:

Private Sub InitializeComponent()
.
.
.
Me.Location=New Point(-2000,-2000)
.
.
.
End Sub

Stellen Sie sicher, dass der Speicherort auf einen Wert eingestellt ist, der über oder unter den Bildschirmabmessungen liegt. Wenn Sie das Formular später anzeigen möchten, legen Sie den Speicherort auf einen Wert innerhalb der Bildschirmabmessungen fest.

steve_k
quelle