.net system system-tray

cómo poner una aplicación.net en la bandeja del sistema cuando se minimiza?



c# minimize to tray (3)

¿alguien puede sugerir un buen ejemplo de código de código vb.net/c# para poner la aplicación en la bandeja del sistema cuando se minize.


Agregue un control NotifyIcon a su formulario, luego use el siguiente código:

private void frm_main_Resize(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized) { this.ShowInTaskbar = false; this.Hide(); notifyIcon1.Visible = true; } } private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { this.Show(); this.WindowState = FormWindowState.Normal; this.ShowInTaskbar = true; notifyIcon1.Visible = false; }

Es posible que no necesite establecer la propiedad ShowInTaskbar.


Puede aprovechar un control incorporado llamado NotifyIcon. Esto crea un icono de bandeja cuando se muestra. @Phillip tiene un ejemplo de código que está algo completo.

Hay un gotcha sin embargo:

Debe anular el formulario principal de la aplicación Eliminar el método para llamar a Dispose en NotifyIcon; de lo contrario, permanecerá en la bandeja después de que la aplicación finalice.

public void Form_Dispose(object sender, EventArgs e) { if (this.Disposing) notifyIcon1.Dispose(); }

Algo como eso.


Puede hacer esto agregando un NotifyIcon a su formulario y manejando el evento de cambio de tamaño del formulario. Para volver desde la bandeja, maneje el evento de doble clic de NotifyIcon.

Si desea agregar un poco de animación, puede hacer esto también ...

1) Agregue el siguiente módulo:

Module AnimatedMinimizeToTray Structure RECT Public left As Integer Public top As Integer Public right As Integer Public bottom As Integer End Structure Structure APPBARDATA Public cbSize As Integer Public hWnd As IntPtr Public uCallbackMessage As Integer Public uEdge As ABEdge Public rc As RECT Public lParam As IntPtr End Structure Enum ABMsg ABM_NEW = 0 ABM_REMOVE = 1 ABM_QUERYPOS = 2 ABM_SETPOS = 3 ABM_GETSTATE = 4 ABM_GETTASKBARPOS = 5 ABM_ACTIVATE = 6 ABM_GETAUTOHIDEBAR = 7 ABM_SETAUTOHIDEBAR = 8 ABM_WINDOWPOSCHANGED = 9 ABM_SETSTATE = 10 End Enum Enum ABNotify ABN_STATECHANGE = 0 ABN_POSCHANGED ABN_FULLSCREENAPP ABN_WINDOWARRANGE End Enum Enum ABEdge ABE_LEFT = 0 ABE_TOP ABE_RIGHT ABE_BOTTOM End Enum Public Declare Function SHAppBarMessage Lib "shell32.dll" Alias "SHAppBarMessage" (ByVal dwMessage As Integer, ByRef pData As APPBARDATA) As Integer Public Const ABM_GETTASKBARPOS As Integer = &H5& Public Const WM_SYSCOMMAND As Integer = &H112 Public Const SC_MINIMIZE As Integer = &HF020 Public Sub AnimateWindow(ByVal ToTray As Boolean, ByRef frm As Form, ByRef icon As NotifyIcon) '' get the screen dimensions Dim screenRect As Rectangle = Screen.GetBounds(frm.Location) '' figure out where the taskbar is (and consequently the tray) Dim destPoint As Point Dim BarData As APPBARDATA BarData.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(BarData) SHAppBarMessage(ABMsg.ABM_GETTASKBARPOS, BarData) Select Case BarData.uEdge Case ABEdge.ABE_BOTTOM, ABEdge.ABE_RIGHT '' Tray is to the Bottom Right destPoint = New Point(screenRect.Width, screenRect.Height) Case ABEdge.ABE_LEFT '' Tray is to the Bottom Left destPoint = New Point(0, screenRect.Height) Case ABEdge.ABE_TOP '' Tray is to the Top Right destPoint = New Point(screenRect.Width, 0) End Select '' setup our loop based on the direction Dim a, b, s As Single If ToTray Then a = 0 b = 1 s = 0.05 Else a = 1 b = 0 s = -0.05 End If '' "animate" the window Dim curPoint As Point, curSize As Size Dim startPoint As Point = frm.Location Dim dWidth As Integer = destPoint.X - startPoint.X Dim dHeight As Integer = destPoint.Y - startPoint.Y Dim startWidth As Integer = frm.Width Dim startHeight As Integer = frm.Height Dim i As Single For i = a To b Step s curPoint = New Point(startPoint.X + i * dWidth, startPoint.Y + i * dHeight) curSize = New Size((1 - i) * startWidth, (1 - i) * startHeight) ControlPaint.DrawReversibleFrame(New Rectangle(curPoint, curSize), frm.BackColor, FrameStyle.Thick) System.Threading.Thread.Sleep(15) ControlPaint.DrawReversibleFrame(New Rectangle(curPoint, curSize), frm.BackColor, FrameStyle.Thick) Next If ToTray Then '' hide the form and show the notifyicon frm.Hide() icon.Visible = True Else '' hide the notifyicon and show the form icon.Visible = False frm.Show() End If End Sub End Module

2) Agregue un NotifyIcon a su formulario y agregue lo siguiente:

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) If m.Msg = WM_SYSCOMMAND AndAlso m.WParam.ToInt32() = SC_MINIMIZE Then AnimateWindow(True, Me, NotifyIcon1) Exit Sub End If MyBase.WndProc(m) End Sub Private Sub NotifyIcon1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles NotifyIcon1.DoubleClick AnimateWindow(False, Me, NotifyIcon1) End Sub