Click to Rate and Give Feedback
MSDN
MSDN Library
.NET Development
.NET Framework 3.5
NotifyIcon Class

  Switch on low bandwidth view
This page is specific to
Microsoft Visual Studio 2008/.NET Framework 3.5

Other versions are also available for the following:
.NET Framework Class Library
NotifyIcon Class

Specifies a component that creates an icon in the notification area. This class cannot be inherited.

Namespace:  System.Windows.Forms
Assembly:  System.Windows.Forms (in System.Windows.Forms.dll)
Visual Basic (Declaration)
Public NotInheritable Class NotifyIcon _
    Inherits Component
Visual Basic (Usage)
Dim instance As NotifyIcon
C#
public sealed class NotifyIcon : Component
Visual C++
public ref class NotifyIcon sealed : public Component
JScript
public final class NotifyIcon extends Component

Icons in the notification area are shortcuts to processes that are running in the background of a computer, such as a virus protection program or a volume control. These processes do not come with their own user interfaces. The NotifyIcon class provides a way to program in this functionality. The Icon property defines the icon that appears in the notification area. Pop-up menus for an icon are addressed with the ContextMenu property. The Text property assigns ToolTip text. In order for the icon to show up in the notification area, the Visible property must be set to true.

The following code example demonstrates using the NotifyIcon class to display an icon for an application in the notification area. The example demonstrates setting the Icon, ContextMenu, Text, and Visible properties and handling the DoubleClick event. A ContextMenu with an Exit item on it is assigned to the NotifyIcon..::.ContextMenu property, which allows the user to close the application. When the DoubleClick event occurs, the application form is activated by calling the Form..::.Activate method.

Visual Basic
Imports System
Imports System.Drawing
Imports System.Windows.Forms

Public NotInheritable Class Form1
    Inherits System.Windows.Forms.Form

    Private contextMenu1 As System.Windows.Forms.ContextMenu
    Friend WithEvents menuItem1 As System.Windows.Forms.MenuItem
    Friend WithEvents notifyIcon1 As System.Windows.Forms.NotifyIcon
    Private components As System.ComponentModel.IContainer

    <System.STAThread()> _
    Public Shared Sub Main()
        System.Windows.Forms.Application.Run(New Form1)
    End Sub 'Main

    Public Sub New()

        Me.components = New System.ComponentModel.Container
        Me.contextMenu1 = New System.Windows.Forms.ContextMenu
        Me.menuItem1 = New System.Windows.Forms.MenuItem

        ' Initialize contextMenu1
        Me.contextMenu1.MenuItems.AddRange(New System.Windows.Forms.MenuItem() _
                            {Me.menuItem1})

        ' Initialize menuItem1
        Me.menuItem1.Index = 0
        Me.menuItem1.Text = "E&xit"

        ' Set up how the form should be displayed.
        Me.ClientSize = New System.Drawing.Size(292, 266)
        Me.Text = "Notify Icon Example"

        ' Create the NotifyIcon.
        Me.notifyIcon1 = New System.Windows.Forms.NotifyIcon(Me.components)

        ' The Icon property sets the icon that will appear
        ' in the systray for this application.
        notifyIcon1.Icon = New Icon("appicon.ico")

        ' The ContextMenu property sets the menu that will
        ' appear when the systray icon is right clicked.
        notifyIcon1.ContextMenu = Me.contextMenu1

        ' The Text property sets the text that will be displayed,
        ' in a tooltip, when the mouse hovers over the systray icon.
        notifyIcon1.Text = "Form1 (NotifyIcon example)"
        notifyIcon1.Visible = True
    End Sub 'New

    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        ' Clean up any components being used.
        If disposing Then
            If (components IsNot Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub 'Dispose

    Private Sub notifyIcon1_DoubleClick(Sender as object, e as EventArgs) handles notifyIcon1.DoubleClick
        ' Show the form when the user double clicks on the notify icon.

        ' Set the WindowState to normal if the form is minimized.
        if (me.WindowState = FormWindowState.Minimized) then _
            me.WindowState = FormWindowState.Normal

        ' Activate the form.
        me.Activate()
    end sub

    Private Sub menuItem1_Click(Sender as object, e as EventArgs) handles menuItem1.Click
        ' Close the form, which closes the application.
        me.Close()
    end sub

End Class 'Form1

C#
using System;
using System.Drawing;
using System.Windows.Forms;

public class Form1 : System.Windows.Forms.Form
{
    private System.Windows.Forms.NotifyIcon notifyIcon1;
    private System.Windows.Forms.ContextMenu contextMenu1;
    private System.Windows.Forms.MenuItem menuItem1;
    private System.ComponentModel.IContainer components;

    [STAThread]
    static void Main() 
    {
        Application.Run(new Form1());
    }

    public Form1()
    {
        this.components = new System.ComponentModel.Container();
        this.contextMenu1 = new System.Windows.Forms.ContextMenu();
        this.menuItem1 = new System.Windows.Forms.MenuItem();

        // Initialize contextMenu1
        this.contextMenu1.MenuItems.AddRange(
                    new System.Windows.Forms.MenuItem[] {this.menuItem1});

        // Initialize menuItem1
        this.menuItem1.Index = 0;
        this.menuItem1.Text = "E&xit";
        this.menuItem1.Click += new System.EventHandler(this.menuItem1_Click);

        // Set up how the form should be displayed.
        this.ClientSize = new System.Drawing.Size(292, 266);
        this.Text = "Notify Icon Example";

        // Create the NotifyIcon.
        this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);

        // The Icon property sets the icon that will appear
        // in the systray for this application.
        notifyIcon1.Icon = new Icon("appicon.ico");

        // The ContextMenu property sets the menu that will
        // appear when the systray icon is right clicked.
        notifyIcon1.ContextMenu = this.contextMenu1;

        // The Text property sets the text that will be displayed,
        // in a tooltip, when the mouse hovers over the systray icon.
        notifyIcon1.Text = "Form1 (NotifyIcon example)";
        notifyIcon1.Visible = true;

        // Handle the DoubleClick event to activate the form.
        notifyIcon1.DoubleClick += new System.EventHandler(this.notifyIcon1_DoubleClick);

    }

    protected override void Dispose( bool disposing )
    {
        // Clean up any components being used.
        if( disposing )
            if (components != null)
                components.Dispose();            

        base.Dispose( disposing );
    }

    private void notifyIcon1_DoubleClick(object Sender, EventArgs e) 
    {
        // Show the form when the user double clicks on the notify icon.

        // Set the WindowState to normal if the form is minimized.
        if (this.WindowState == FormWindowState.Minimized)
            this.WindowState = FormWindowState.Normal;

        // Activate the form.
        this.Activate();
    }

    private void menuItem1_Click(object Sender, EventArgs e) {
        // Close the form, which closes the application.
        this.Close();
    }
}

Visual C++
#using <System.dll>
#using <System.Windows.Forms.dll>
#using <System.Drawing.dll>

using namespace System;
using namespace System::Drawing;
using namespace System::Windows::Forms;
public ref class Form1: public System::Windows::Forms::Form
{
private:
   System::Windows::Forms::NotifyIcon^ notifyIcon1;
   System::Windows::Forms::ContextMenu^ contextMenu1;
   System::Windows::Forms::MenuItem^ menuItem1;
   System::ComponentModel::IContainer^ components;

public:
   Form1()
   {
      this->components = gcnew System::ComponentModel::Container;
      this->contextMenu1 = gcnew System::Windows::Forms::ContextMenu;
      this->menuItem1 = gcnew System::Windows::Forms::MenuItem;

      // Initialize contextMenu1
      array<System::Windows::Forms::MenuItem^>^temp0 = {this->menuItem1};
      this->contextMenu1->MenuItems->AddRange( temp0 );

      // Initialize menuItem1
      this->menuItem1->Index = 0;
      this->menuItem1->Text = "E&xit";
      this->menuItem1->Click += gcnew System::EventHandler( this, &Form1::menuItem1_Click );

      // Set up how the form should be displayed.
      this->ClientSize = System::Drawing::Size( 292, 266 );
      this->Text = "Notify Icon Example";

      // Create the NotifyIcon.
      this->notifyIcon1 = gcnew System::Windows::Forms::NotifyIcon( this->components );

      // The Icon property sets the icon that will appear
      // in the systray for this application.
      notifyIcon1->Icon = gcnew System::Drawing::Icon( "appicon.ico" );

      // The ContextMenu property sets the menu that will
      // appear when the systray icon is right clicked.
      notifyIcon1->ContextMenu = this->contextMenu1;

      // The Text property sets the text that will be displayed,
      // in a tooltip, when the mouse hovers over the systray icon.
      notifyIcon1->Text = "Form1 (NotifyIcon example)";
      notifyIcon1->Visible = true;

      // Handle the DoubleClick event to activate the form.
      notifyIcon1->DoubleClick += gcnew System::EventHandler( this, &Form1::notifyIcon1_DoubleClick );
   }

protected:
   ~Form1()
   {
      if ( components != nullptr )
      {
         delete components;
      }
   }

private:
   void notifyIcon1_DoubleClick( Object^ /*Sender*/, EventArgs^ /*e*/ )
   {

      // Show the form when the user double clicks on the notify icon.
      // Set the WindowState to normal if the form is minimized.
      if ( this->WindowState == FormWindowState::Minimized )
            this->WindowState = FormWindowState::Normal;

      // Activate the form.
      this->Activate();
   }

   void menuItem1_Click( Object^ /*Sender*/, EventArgs^ /*e*/ )
   {

      // Close the form, which closes the application.
      this->Close();
   }

};

[STAThread]
int main()
{
   Application::Run( gcnew Form1 );
}

System..::.Object
  System..::.MarshalByRefObject
    System.ComponentModel..::.Component
      System.Windows.Forms..::.NotifyIcon
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

.NET Framework

Supported in: 3.5, 3.0, 2.0, 1.1, 1.0
Tags What's this?: Add a tag
Community Content   What is Community Content?
Add new content RSS  Annotations
Application's Icon      Jack Tripper   |   Edit   |   Show History

You must assign an icon to the Icon property. This icon is different than the BalloonTipIcon in that it's the icon that will appear in the notification area itself. If you don't assign Icon, then no balloon will appear.

notifyIcon1.Icon = Icon.ExtractAssociatedIcon( Application.ExecutablePath );

Additionally, the notifyIcon must be visible before you can call ShowBalloonTip()

So a full, simplified, example is:

notifyIcon1.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);
notifyIcon1.Visible = true;
notifyIcon1.BalloonTipIcon = ToolTipIcon.Error;
notifyIcon1.BalloonTipTitle = "Delayed Write Failed";
notifyIcon1.BalloonTipText = "Some of your data has been lost.";
notifyIcon1.ShowBalloonTip(0);

Tags What's this?: Add a tag
Flag as ContentBug
NotifyIcon remains visible after disposed      Đonny   |   Edit   |   Show History
I've observed an odd behavior of NotifyIcon. It remains visible after application closes and stays visible untill mouse-hovered.

Note: My icon was created programaticaly (not placed as component on forms) and I haven't set its Container property.

For simple example I've created following console application. In console application it's quite easy to Dispose NotifyIncon before Main quits, but in real-world application I expect do Dispose resources used by NotifyInconHolder when it's being Disposed/Finalized. But in that point the noi variable is already disposed (you cannot set its Visible = False - it fails). And the Disposed event is not raised by noi.

Imports System.Windows.Forms
Module Module1
Sub Main()
Dim nh As New NotifyIconHolder
End Sub
End Module
Friend Class NotifyIconHolder
Implements IDisposable
Private noi As New NotifyIcon
Public Sub New()
noi.Icon = New Drawing.Icon("D:\Program Files\Microsoft Visual Studio 8\Common7\VS2005ImageLibrary\icons\Misc\Code_ClassCS.ico")
noi.Visible = True
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
noi.Dispose()
GC.SuppressFinalize(Me)
End Sub
Protected Overrides Sub Finalize()
Dispose()
MyBase.Finalize()
End Sub
End Class


The only workaround I was able to work out follows. It involver P/Inwoke to Win32 API and does what youser do to hide the icon: Finds the systray, shows hidden icons, moves mouse over systray.

Imports

System.Windows.Forms

Module

Module1

Sub Main()

Dim nh AsNew NotifyIconHolder

EndSub

End

Module

Friend

Class NotifyIconHolder

Implements IDisposable

Private noi AsNew NotifyIcon

PublicSubNew()

noi.Icon =

New Drawing.Icon("D:\Program Files\Microsoft Visual Studio 8\Common7\VS2005ImageLibrary\icons\Misc\Code_ClassCS.ico")

noi.Text =

"TestIcon"

noi.Visible =

True

EndSub

Private Disposed AsBoolean

PublicSub Dispose() Implements IDisposable.Dispose

noi.Dispose()

IfNot Disposed Then

Dim Shell_TrayWnd% = FindWindow("Shell_TrayWnd", Nothing)

If Shell_TrayWnd <> 0Then

Dim TrayNotifyWnd% = FindWindowEx(Shell_TrayWnd, 0, "TrayNotifyWnd", Nothing)

If TrayNotifyWnd <> 0Then

Dim SysPager% = FindWindowEx(TrayNotifyWnd, 0, "SysPager", Nothing)

If SysPager <> 0Then

Dim ToolbarWindow32% = FindWindowEx(SysPager, 0, "ToolbarWindow32", Nothing)

Dim Button% = FindWindowEx(TrayNotifyWnd, 0, "Button", Nothing)

If Button <> 0Then

SendMessage(Button, WM_LBUTTONDOWN, MK_LBUTTON,

0)

SendMessage(Button, WM_LBUTTONUP,

0, 0)

EndIf

If ToolbarWindow32 <> 0Then

Dim Rect AsNew RECT

GetWindowRect(ToolbarWindow32, Rect)

For i AsInteger = Rect.Left To Rect.Right Step8

SendMessage(ToolbarWindow32, WM_MOUSEMOVE,

0, i - Rect.Left Or8 << 16)

Next i

EndIf

EndIf

EndIf

EndIf

Disposed =

True

EndIf

GC.SuppressFinalize(

Me)

EndSub

ProtectedOverridesSub Finalize()

Dispose()

MyBase.Finalize()

EndSub

End

Class

Friend

Module API

PublicDeclareAutoFunction FindWindow Lib"user32.dll" (ByVal lpClassName AsString, ByVal lpWindowName AsString) As Int32

PublicDeclareAutoFunction FindWindowEx Lib"user32.dll" (ByVal hWnd1 As Int32, ByVal hWnd2 As Int32, ByVal lpsz1 AsString, ByVal lpsz2 AsString) As Int32

PublicDeclareAutoFunction SendMessage Lib"user32.dll" (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32

PublicConst WM_MOUSEMOVE As Int32 = &H200

PublicConst WM_LBUTTONDOWN As Int32 = &H201

PublicConst WM_LBUTTONUP As Int32 = &H202

PublicConst MK_LBUTTON As Int32 = &H1

PublicDeclareFunction GetWindowRect Lib"user32.dll" (ByVal hwnd As Int32, ByRef lpRect As RECT) As Int32

End

Module

<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> _

Public

Structure RECT

Public Left As Int32

Public Top As Int32

Public Right As Int32

Public Bottom As Int32

End

Structure

Bug report at https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=98317. MS is not going to fix this buggy behavior.

Flag as ContentBug
NotifyIcon remains visible after disposed 2      Kovacs L Attila   |   Edit   |   Show History
NotifyIcon remains visible after the application closes and stays visible untill mouse-hovered. Use of "Visible = false" under FormClosing does not help.

A solution is to use: noi->Icon = nullptr on form close.
Processing
© 2009 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Page view tracker