Was ist der richtige Weg, um eine C#-WinForms-App in die Taskleiste zu minimieren?

StackOverflow https://stackoverflow.com/questions/46918

  •  09-06-2019
  •  | 
  •  

Frage

Was ist der richtige Weg, um eine WinForms-App in der Taskleiste zu minimieren?

Notiz:minimieren auf System Tray;auf der rechten Seite der Taskleiste neben der Uhr.Ich frage nicht nach der Minimierung auf die Taskleiste, was passiert, wenn Sie im Fenster auf die Schaltfläche „Minus“ klicken.

Ich habe Hacker-Lösungen wie „Minimieren, ShowInTaskbar = false setzen und dann Ihr NotifyIcon anzeigen“ gesehen.

Lösungen wie diese sind hackig, da die App nicht wie andere Apps scheinbar auf die Taskleiste minimiert wird und der Code unter anderem erkennen muss, wann ShowInTaskbar = true gesetzt werden muss.

Was ist der richtige Weg, dies zu tun?

War es hilfreich?

Lösung

Es gibt tatsächlich keine verwaltete Möglichkeit, diese Form der Animation in der Taskleiste in nativen Winforms durchzuführen. Sie können jedoch Shell32.dll per P/Invoke ausführen, um dies zu tun:

Hier ein paar gute Infos (in den Kommentaren, nicht im Beitrag):

http://blogs.msdn.com/jfoscoding/archive/2005/10/20/483300.aspx

Und hier ist es in C++:

http://www.codeproject.com/KB/shell/minimizetotray.aspx

Damit können Sie herausfinden, welche Dinge Sie für Ihre C#-Version per Pinvoke verwenden müssen.

Andere Tipps

this.WindowState = FormWindowState.Minimized  

Das ist die eingebaute Vorgehensweise und für mich sieht es die meiste Zeit gut aus.Das einzige Mal, dass es etwas seltsam ist, ist, wenn man es beim Start aufruft, was manchmal etwas seltsam ist, weshalb die meisten Leute auch ShowInTaskbar = false setzen und das Formular ebenfalls ausblenden.

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.windowstate.aspx

Es wird helfen:

public partial class Form1 : Form
{
    public static bool Close = false;
    Icon[] images;
    int offset = 0;

    public Form1()
    {
        InitializeComponent();

        notifyIcon1.BalloonTipText = "My application still working...";
        notifyIcon1.BalloonTipTitle = "My Sample Application";
        notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; 
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        if (FormWindowState.Minimized == WindowState)
        {
            this.Hide();
            notifyIcon1.ShowBalloonTip(500);
            //WindowState = FormWindowState.Minimized;
        }
    }

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        this.Show();
        notifyIcon1.ShowBalloonTip(1000);
        WindowState = FormWindowState.Normal;
    }

    private void maximizeToolStripMenuItem_Click(object sender, EventArgs e)
    {
        this.Show();
        WindowState = FormWindowState.Normal;
    }

    private void closeToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Close = true;
        this.Close();  
    }

    // Handle Closing of the Form.
    protected override void OnClosing(CancelEventArgs e)
    {
        if (Close)
        {
            e.Cancel = false;
        }
        else
        {
            WindowState = FormWindowState.Minimized;
            e.Cancel = true;
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // Load the basic set of eight icons.
        images = new Icon[5];
        images[0] = new Icon("C:\\icon1.ico");
        images[1] = new Icon("C:\\icon2.ico");
        images[2] = new Icon("C:\\icon3.ico");
        images[3] = new Icon("C:\\icon4.ico");
        images[4] = new Icon("C:\\icon5.ico");
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        // Change the icon.
        // This event handler fires once every second (1000 ms).
        if (offset < 5)
        {
            notifyIcon1.Icon = images[offset];
            offset++;
        }
        else
        {
            offset = 0;
        }
    }
}

Dieser Code ist getestet und unterstützt viele Optionen.

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

Aktualisieren:Es sieht so aus, als hätte ich zu früh gepostet.Ich habe den folgenden Hack auch für eines meiner Tools verwendet.Ich warte auf die richtige Lösung dafür..........

Sie können hierfür Windows.Forms.NotifyIcon verwenden. http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx

Fügen Sie NotifyIcon zum Formular hinzu, legen Sie einige Eigenschaften fest und fertig.

        this.ShowIcon = false;//for the main form
        this.ShowInTaskbar = false;//for the main form
        this.notifyIcon1.Visible = true;//for notify icon
        this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));//set an icon for notifyicon

    private void Form1_Shown(object sender, EventArgs e)
    {
        this.Hide();
    }

Ähnlich wie oben...

Ich habe einen Größenänderungs-Ereignishandler, der immer dann ausgelöst wird, wenn die Größe des Fensters geändert wird (maximiert, minimiert usw.) ...

    public form1()
    {
       Initialize Component();

       this.Resize += new EventHanlder(form1_Resize);
    } 


    private void form1_Resize(object sender, EventArgs e)
    {
       if (this.WindowState == FormWindowState.Minimized && minimizeToTrayToolStripMenuItem.Checked == true)
       {
             NotificationIcon1.Visible = true;
             NotificationIcon1.BalloonTipText = "Tool Tip Text"
             NotificationIcon1.ShowBalloonTip(2);  //show balloon tip for 2 seconds
             NotificationIcon1.Text = "Balloon Text that shows when minimized to tray for 2 seconds";
             this.WindowState = FormWindowState.Minimized;
             this.ShowInTaskbar = false;
       }
    }

Dadurch kann der Benutzer über eine Menüleiste auswählen, ob er die Taskleiste minimieren möchte oder nicht.Sie können zu Windows -> gehen und auf „In Taskleiste minimieren“ klicken.Wenn dies überprüft wird und das Fenster zu minimiert geändert wird, minimiert es für das Tablett.Funktioniert bei mir einwandfrei.

Im Konstruktor des Formulars:

this.Resize += new EventHandler(MainForm_Minimize);

Verwenden Sie dann diese Event-Handler-Methode:

    private void MainForm_Minimize(object sender, EventArgs e)
    {
        if(this.WindowState == FormWindowState.Minimized)
            Hide();
    }

Wenn Sie Probleme haben, dies zum Laufen zu bringen, überprüfen Sie, ob dies der Fall ist

this.Resize += new System.EventHandler(this.Form1_Resize);

in der fom1.designer.cs

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top