wake-up-neo.net

Wie starte ich die WinForm-App in der Taskleiste?

Ich habe erfolgreich eine App erstellt, die mithilfe eines NotifyIcon auf die Taskleiste minimiert wird. Wenn das Formular manuell geschlossen wird, wird es erfolgreich vom Desktop, der Taskleiste und der Alt-Registerkarte ausgeblendet. Das Problem tritt auf, wenn versucht wird, die App zu minimieren. Zunächst bestand das Problem darin, dass die App minimiert wurde, aber immer noch im Dialogfeld "Alt" angezeigt wird. Das Ändern des FormBorderStyles in eine der ToolWindow-Optionen (von der Option "Keine") behebt dies, führte jedoch zu einem anderen Problem. Beim ersten Start der App ist die Titelzeile des minimierten Fensters direkt über dem Startmenü sichtbar:

 enter image description here

Wenn Sie das Formular öffnen und schließen, wird es ordnungsgemäß ausgeblendet. Ich habe viele Variationen ausprobiert, aber im Wesentlichen funktioniert es jetzt ...

WindowState ist im Designer auf Minimiert gesetzt. Nach einiger Initialisierung im Konstruktor habe ich folgende Zeilen:

this.Visible = false;
this.ShowInTaskbar = false;

Wenn auf das NotifyIcon doppelt geklickt wird, habe ich Folgendes:

 this.WindowState = FormWindowState.Normal;
 this.Visible = true;
 this.ShowInTaskbar = true;

Wie gesagt, ich habe viele kleinere Variationen (this.Hide () usw.) ausprobiert. Gibt es eine Möglichkeit, das NotifyIcon als Hauptkomponente zu verwenden, sodass ich das Formular vollständig starten und entsorgen kann, während das NotifyIcon aktiv bleibt? Es muss eine Möglichkeit geben, die App mit dem minimierten Formular zu starten, ohne dass dabei die Eigenartigkeit aufkommt. Bitte hilf mir, es zu finden!

44
jluce50

Der richtige Weg, dies zu tun, besteht darin, zu verhindern, dass das Formular überhaupt sichtbar wird. Dies erfordert das Überschreiben von SetVisibleCore (). Nehmen wir an, ein Kontextmenü für das NotifyIcon mit dem Befehl Show and Exit. Sie können es so implementieren:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        notifyIcon1.ContextMenuStrip = contextMenuStrip1;
        this.showToolStripMenuItem.Click += showToolStripMenuItem_Click;
        this.exitToolStripMenuItem.Click += exitToolStripMenuItem_Click;
    }

    private bool allowVisible;     // ContextMenu's Show command used
    private bool allowClose;       // ContextMenu's Exit command used

    protected override void SetVisibleCore(bool value) {
        if (!allowVisible) {
            value = false;
            if (!this.IsHandleCreated) CreateHandle();
        }
        base.SetVisibleCore(value);
    }

    protected override void OnFormClosing(FormClosingEventArgs e) {
        if (!allowClose) {
            this.Hide();
            e.Cancel = true;
        }
        base.OnFormClosing(e);
    }

    private void showToolStripMenuItem_Click(object sender, EventArgs e) {
        allowVisible = true;
        Show();
    }

    private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
        allowClose = true;
        Application.Exit();
    }
}

Achten Sie beim Load-Ereignis auf eine Falte. Es wird erst ausgelöst, wenn das Hauptformular zum ersten Mal angezeigt wird. Stellen Sie daher sicher, dass Sie die Initialisierung im Konstruktor des Formulars durchführen, nicht im Load-Ereignishandler.

75
Hans Passant

Entfernen Sie im Konstruktor diese beiden Zeilen:

this.Visible = false;
this.ShowInTaskbar = false;

und nach InitializeComponent(); hinzufügen:

this.WindowState = FormWindowState.Minimized;

Setzen Sie im Designer ShowInTaskbar auf false & FormWindowState auf Normal.

EDIT: Wenn Sie dasselbe im Load-Ereignis bereitstellen, wird das Fenster minimiert, auf dem Desktop jedoch immer noch minimiert. Ich denke das ist ein Fehler.

17
Yogesh

Ich lese alle Antworten und sehe Hacks und schwarze Magie ... (keine Beleidigung, Kumpels)

Jungs, keine Hacks nötig. Sie müssen nicht einmal "ShowInTaskbar = false" und anderes einstellen. Mach einfach das:

    //"Form Shown" event handler
    private void Form_Shown(object sender, EventArgs e)
    {
        //to minimize window
        this.WindowState = FormWindowState.Minimized;

        //to hide from taskbar
        this.Hide();
    }

HINWEIS: Ich empfehle dringend, die Eigenschaft "ShowInTaskbar" NICHT zu berühren. Wenn Ihre Anwendung z. B. systemweite Hotkeys oder ähnliches registriert (Hooks usw.), wird durch das Setzen von ShowInTaskBar = false und das Minimieren der App verhindert, dass Windows einige Nachrichten an Ihr Fenster sendet aufhören zu arbeiten.

15
Alex

Wenn Sie eine Anwendung minimieren und sie vor Alt + Tab ausblenden möchten:

Sie müssen außerdem die Deckkraft so einstellen, dass die Titelleiste in der Nähe des Startmenüs nicht angezeigt wird, wenn Sie den Rahmenstil als Werkzeugfenster festlegen.

Bei Minimize Event:

this.Visible = false;
this.Opacity = 0;
this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
this.ShowInTaskbar = false;

Ereignis normalisieren:

this.Visible = true;
this.Opacity = 100;
this.FormBorderStyle = FormBorderStyle.FixedSingle; //or whatever it was previously set to
this.ShowInTaskbar = true;
2
Justin Clarke

Diese "schnelle und schmutzige Lösung" funktionierte für mich:

$form1.FormBorderStyle = "fixedtoolwindow"
$form1.top = -1000000
$form1.Left = -1000000
$form1.Width = 10
$form1.Height = 10
$form1.WindowState = "normal"
$form1.ShowInTaskbar = $False
$form1.Opacity = 0
$form1.Hide()

Hoffe es hilft jemand anderem ...

0
David R