it-swarm-eu.dev

Einzelnes Formular beim Start ausblenden

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

Das Formular wird automatisch angezeigt, wenn dies erforderlich ist (vergleichbar mit einem Popup im Outlook 2003-Stil), aber ich kann herausfinden, wie das Formular beim Laden ausgeblendet werden kann, ohne dass es chaotisch wird.

Irgendwelche Vorschläge?

72
Pondidum

Ich komme dazu aus 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 für Application.Run () entfernen, wird die Anwendung ohne angezeigtes Formular gestartet, und Sie können Formulare beliebig ein- und ausblenden.

Anstatt das Formular in der Load-Methode auszublenden, initialisieren Sie das Formular, bevor Sie Application.Run () aufrufen. Ich gehe davon aus, dass auf dem Formular ein NotifyIcon zum Anzeigen eines Symbols in der Taskleiste angezeigt wird - dies kann auch dann angezeigt werden, wenn das Formular selbst noch nicht sichtbar ist. Durch Aufrufen von Form.Show() oder Form.Hide() von Handlern von NotifyIcon-Ereignissen wird das Formular angezeigt bzw. ausgeblendet.

108
Grokys

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

Erstellen Sie einen Bool in Ihrer Form-Klasse, dessen Standardwert false 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 setzt .Visible = true, nachdem es das Formular geladen hat, wird dies abgefangen und auf false gesetzt. In dem obigen Fall wird es immer auf false gesetzt, bis Sie es aktivieren, indem allowhowdisplay auf true setzen.

Damit das Formular beim Start nicht angezeigt wird, muss SetVisibleCore erneut aktiviert werden, damit es ordnungsgemäß funktioniert, indem allowhowdisplay = true festgelegt wird. Sie möchten dies für jede Benutzeroberflächenfunktion tun, die das Formular anzeigt. In meinem Beispiel ist es das Ereignis "Linksklick" 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;                
    }
}
94
Paul Aicher

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.

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

        base.OnLoad(e);
    }
19
Chriz

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

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

Wenn Sie das Formular vorzeigen 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 Show/Hide-Ereignisse können einfacher die Visible-Eigenschaft des Formulars oder die Show/Hide-Methoden verwenden.

14
Jeff

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

5

Ich habe viel mit diesem Problem zu kämpfen und die Lösung ist viel einfacher als ich. Ich habe zuerst alle Vorschläge ausprobiert, war dann aber mit dem Ergebnis nicht zufrieden und habe es etwas genauer untersucht. Ich fand das, wenn ich das 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 stellte sich heraus, dass, wenn Sie die 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;
}
3
echoen

Sie möchten den Fensterstatus auf "Minimiert" setzen und in der Taskleiste "Falsch" anzeigen. Dann am Ende Ihrer Formulare Load Fensterstatus auf maximiert setzen und in der Taskleiste auf true anzeigen

    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;
    }
3
George

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();
3
Ben Yousaf

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 möglicherweise 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);
    }
...
}
1
LKane

Das funktioniert perfekt für mich:

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

Als ich das Projekt startete, war alles versteckt, auch in der Taskleiste, es sei denn, ich muss es anzeigen.

0
Willy David Jr

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

Es ist besser, das Formular unsichtbar zu starten.

0
Roger Willcocks
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    MainUIForm mainUiForm = new MainUIForm();
    mainUiForm.Visible = false;
    Application.Run();
}
0
kilsek

Hier ist ein einfacher Ansatz:
Es ist in C # (Ich habe im Moment 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;
}
0
aku
    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();
        }

Ich hatte ein ähnliches Problem wie beim Poster, bei dem der Code zum Ausblenden des Formulars im Ereignis form_Load ausgelöst wurde, bevor das Formular vollständig geladen war, wodurch die Methode Hide () fehlschlug (nicht abstürzte, nur nicht erwartungsgemäß 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 dass das, was Sie dort einfügen möchten, problemlos im Konstruktor oder im form_Shown-Ereignis gespeichert werden kann.

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

0
blind Skwirl

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

0
TheUberOverLord

Als Ergänzung zu Grokys Antwort (was meiner Meinung nach die mit Abstand beste Antwort ist) könnten wir auch die ApplicationContext - Klasse erwähnen, die auch (wie in der gezeigt) erlaubt Beispielartikel) die Möglichkeit, zwei (oder sogar mehr) Formulare beim Start der Anwendung zu öffnen und die Anwendungslebensdauer mit allen zu steuern.

0
Eugenio Miró