<!-- Article image -->
<!-- Add the rest of your HTML here -->
I recently wrote a Visual Source Safe sniper application. The purpose of this program is to wait patiently in the background for
selected Visual Source Safe files to be checked in by fellow programmers. When the files become checked in the sniper checks these file
out and notifies the user. This seemed like a perfect job for a notification icon. I was dismayed however to find out that the .NET
NotifyIcon class does not support balloon tips which are currently provided by the newer version of the common
control library. This led to my CodeProject article 'Displaying a Notify Icon's Balloon Tool Tip'.
However this approach was a hack at best and did not allow the application to receive notification when the balloon tip was clicked.
So I decided to bite the bullet and write my own
NotifyIcon class which would give me the ability to do everything I wanted.
I have kept the functionality of this class to the minimum of what I think is useful. For example I do not handle mouse move messages
over the notification icon as I can't think of any good use for these messages. However adding this functionality is quite easy.
List of Features
- Fires the events 'Click', 'Double Click', 'Click Balloon'
- Declares properties 'Visible', 'Icon', 'Text', 'Context Menu'
- Removes icon from notification area when garbage collected (there you go Nish)
- Re-adds icon if explorer restarts
- Provides the method
ShowBalloon(string title, string text, int timeout)
How It Works
My class uses a similar approach to the .NET class in that it creates a hidden window to receive messages from the notify icon.
These messages are then forwarded to the main class
NotifyIconEx where they are filtered according to the notification icon's
numeric ID. My class can be used to add multiple notify icons and all messages are handled by the one hidden window. At this point I
must admit that I used the 'Anakrino' decompiler to take a peek at some of the code used to implement .NET's NotifyIcon class. I mainly
used this to figure out how to display the context menu at the correct location and how to make sure that when you click outside of the
menu it closes for you.
Platform invoke methods are used quite extensively in this class which is unfortunate but necessary. Hopefully as .NET matures the
class library will expand to allow more advanced manipulations of windows and system functions but until then it's either scrap the cool
feature or fall back to the Win32 API.
I must admit that the documentation concerning the balloon tip does not seem to match the behaviour. The timeout value does not seem to
work. I could not get the correct windows message when the balloon is closed by the 'x' button. I get the 'timeout' message whether the
balloon times out or it is closed by the user. Let me know if I have done anything wrong in regards to these issues or if anybody gets
different results than I did on my XP machine.
I must warn you that if you use my
NotifyIconEx class at the same time as
NotifyIcon strange things may happen.
See if you can figure out why.
I think you will find that my class is as simple to use is that supplied by .NET, if not simpler (you do not have to explicitly remove my
icon when your application exits). You should be able to add the class to the toolbox and drag and drop it using the form designer as
you can with the built in class.