views:

1579

answers:

5

can anyone please suggest a good code example of vb.net/c# code to put the application in system tray when minized.

+10  A: 

Add a NotifyIcon control to your form, then use the following code:

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

You may not need to set the ShowInTaskbar property.

Phillip Wells
Your sample is grossly incomplete.
FlySwat
Can you elaborate?
Phillip Wells
Your missing the declarations from the form, the notifyIcon control, and your missing the overridden dispose method :)
FlySwat
Though I noticed you edited, and added some instructions, so ignore my critique :)
FlySwat
To the point. i got what i need thanks Phillip.
bugBurger
+1  A: 

I did a little searching, maybe this will help:

http://www.developer.com/net/csharp/article.php/3336751

itsmatt
+2  A: 

You can leverage a built in control called NotifyIcon. This creates a tray icon when shown. @Phillip has a code example that is somewhat complete.

There is a gotcha though:

You must override your applications main form Dispose method to call Dispose on NotifyIcon, otherwise it will stay in your tray after application exits.

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

Something like that.

FlySwat
Thanks for missing part.
bugBurger
This shouldn't be necessary if you put the notify icon on the form using the designer - the VS-generated Dispose() will call components.Dispose() which should dispose all components which were created with it as a container.
Jesse C. Slicer
A: 

You can do this by adding a NotifyIcon to your form and handling the form's resize event. To get back from the tray handle the NotifyIcon's double-click event.

If you want to add a little animation you can do this too...

1) Add the following module:

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) Add a NotifyIcon to your form an add the following:

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
Sean Gough
A: 

Here is a very simple method to do this and much more with NotifyIcon using project settings.

More here: http://code.msdn.microsoft.com/TheNotifyIconExample