2012-11-29 20 views
11

Witam W mojej aplikacji C# staram się minimalizować aplikację do zasobnika systemowego, gdy formularz jest zamknięty. Oto kod, który próbowałem.C# Zminimalizuj do zasobnika systemowego przy zamykaniu

public void MinimizeToTray() 
    { 
     try 
     { 
      notifyIcon1.BalloonTipTitle = "Sample text"; 
      notifyIcon1.BalloonTipText = "Form is minimized"; 

      if (FormWindowState.Minimized == this.WindowState) 
      { 
       notifyIcon1.Visible = true; 
       notifyIcon1.ShowBalloonTip(500); 
       this.Hide(); 
      } 
      else if (FormWindowState.Normal == this.WindowState) 
      { 
       notifyIcon1.Visible = false; 
      } 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 

    } 

i wzywam metodę do utworzenia zdarzenia zamknięcia. Problem polega jednak na tym, że nie ogranicza się do tacy. Właśnie zamyka formularz.

+0

Kiedy formularz jest zamknięty lub zminimalizowany? – Danpe

+0

Czy anulujesz/zatrzymasz zdarzenie close? Ten kod nie pomoże wiele, jeśli aplikacja zostanie zamknięta, mimo że zostanie wykonana. –

+0

Po zamknięciu. – Rakesh

Odpowiedz

10

Napisz zdarzenia w formie Zamknięcie imprezy.

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
     e.Cancel = true;       
     Hide(); 
} 

Napisz przy użyciu paska menu niestandardowego, aby wyświetlić ikonę powiadomienia.

+3

należy dodać linię do konstruktora: this.FormClosing + = this.Form1_FormClosing; – temple

1

Należy anulować zdarzenie FormClosing, a następnie wywołać funkcję MinimizeToTray().

Dokonuje się tego za pomocą właściwości Cancel urządzenia FormClosingEventArgs.

Ponadto, należy rozważyć użycie bool gdzieś pozwalają zamykając Form w pewnych warunkach, takich jak jeśli używasz File > Exit menu lub coś:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if(!allowClosing) 
    { 
     e.Cancel = true; 
     MinimizeToTray(); 
    } 
} 
+0

Zamiast używać allowClosing, możesz wybrać, kiedy zamknąć z FormClosingEventArgs: if (e.CloseReason == CloseReason.UserClosing) { e.Cancel = true; this.WindowState = FormWindowState.Minimized; } –

0

Musisz użyć zdarzenia FormClosing.

kod
private void Form1_FormClosing(Object sender, FormClosingEventArgs e) { 
    e.Cancel = true; 
    MinimizeToTray(); 
} 
29

e.Cancel = true; będzie zawsze anulowanie zdarzenia, nawet jeśli wyłączyć komputer, ale tutaj jest kod, który umożliwia:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason == CloseReason.UserClosing) 
    { 
      myNotifyIcon.Visible = true; 
      this.Hide(); 
      e.Cancel = true; 
    } 
} 

To pozwoli zamykania formy programmaticaly.

+1

To rozwiązanie jest o wiele lepsze, ponieważ rozwiązanie ** arun kumar non ascii ** jest niekończącą się historią: D – Ismoh

+0

Doświadczyłem, że jeśli nie ustawisz obrazu ikony notifyIcon, to nie jest ono wyświetlane w zasobniku systemowym w oknach 8.1. – Fer

1

Aby zminimalizować przy załączaniu ustawić WindowState do Zminimalizowane

private void Form1_FormClosing(Object sender, FormClosingEventArgs e) { 
    e.Cancel = true; 
    WindowState = FormWindowState.Minimized; 
} 
2
namespace MinimizeTrayNotification 
    { 
     public partial class Form1 : Form 
     { 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void MinimzedTray() 
    { 
     notifyIcon1.Visible = true; 
     notifyIcon1.Icon = SystemIcons.Application; 

     notifyIcon1.BalloonTipText = "Minimized"; 
     notifyIcon1.BalloonTipTitle = "Your Application is Running in BackGround"; 
     notifyIcon1.ShowBalloonTip(500); 

    } 

    private void MaxmizedFromTray() 
    { 
     notifyIcon1.Visible = true; 
     notifyIcon1.BalloonTipText = "Maximized"; 
     notifyIcon1.BalloonTipTitle = "Application is Running in Foreground"; 
     notifyIcon1.ShowBalloonTip(500); 


    } 



    private void Form1_Resize(object sender, EventArgs e) 
    { 
     if(FormWindowState.Minimized==this.WindowState) 
     { 
     MinimzedTray(); 
     } 
     else if (FormWindowState.Normal == this.WindowState) 
     { 

      MaxmizedFromTray(); 
     } 
     } 

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) 
    { 
     this.WindowState = FormWindowState.Normal; 
     Form1 frm = new Form1(); 
     frm.Show(); 
     MaxmizedFromTray(); 


    } 

    private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) 
    { 
     this.WindowState = FormWindowState.Normal; 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (e.CloseReason == CloseReason.UserClosing) 
     { 
      e.Cancel = true; 
      this.WindowState = FormWindowState.Minimized; 
      this.ShowInTaskbar = false; 
      this.Hide(); 

     } 


    } 

    private void notifyIcon1_Click(object sender, EventArgs e) 
    { 
     this.WindowState = FormWindowState.Normal; 
     notifyIcon1.BalloonTipText = "Normal"; 
     notifyIcon1.ShowBalloonTip(500); 
    } 
} 

}

+1

Jestem pewien, że kod będzie działał, ale będzie jeszcze bardziej przydatny z komentarzem lub dwoma o tym, co się dzieje! – leo

+0

dla notifyIcon1_MouseDoubleClick, powinieneś użyć 'this.Show()' zamiast tworzenia nowej instancji formularza. Prawdopodobnie chciałbyś, aby Twoje formularze kontrolne zachowały swoje wartości. – prospector

0

można obsługiwać FormClosing wydarzenie takie jak micsoft Form Closing Event jak Poniższy przykład C#

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
    { 
     // Determine if text has changed in the textbox by comparing to original text. 
     if (textBox1.Text != strMyOriginalText) 
     { 
      // Display a MsgBox asking the user to save changes or abort. 
      if (MessageBox.Show("Do you want to save changes to your text?", "My Application", 
       MessageBoxButtons.YesNo) == DialogResult.Yes) 
      { 
       // Cancel the Closing event from closing the form. 
       e.Cancel = true; 
       // Call method to save file... 
      } 
     } 
}