* VB-CODE (2)
Tip 156: Adding New Icons to the Windows 95 Taskbar
December 5, 1995
Abstract
The Microsoft? Windows? 95 taskbar allows you to quickly switch between
applications, launch other applications by using the Start button, and
perform many other similar tasks. When developing your own Microsoft
Visual Basic? applications, you can also add new icons (that is, programs)
to the Windows 95 taskbar. This article explains how you can add icons to
and remove icons from the notification area of the Windows 95 taskbar.
Using the Shell_NotifyIcon Function to Add Taskbar Icons
On a typical desktop in the Microsoft? Windows? 95 operating system, you
can see that the Clock applet is running and that there are no additional
icons on the taskbar you see only the Clock applet icon. After you run the
example program described in this article, the new icon is added to the
taskbar. When the mouse pointer is placed on the taskbar, you can see that
the new icon has been added to the taskbar.
It's easy to add a new icon to the taskbar. The example program below
shows how to add a new icon to the taskbar, perform functions relevant
to that new icon, and then remove the icon from the taskbar. All this
functionality is accomplished by using the Shell_NotifyIcon function. You
can use the Shell_NotifyIcon function in a Visual Basic application to
modify the Windows 95 taskbar. To use this function, you must include the
following Declare statement in the General Declarations section of your
form:
Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA"
(ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
The Shell_NotifyIcon function requires only two arguments. The first
argument is one of the following three messages you want to send to the
Windows 95 taskbar:
NIM_ADD Add a new icon to the taskbar.
NIM_DELETE Remove (delete) an icon from the taskbar.
NIM_MODIFY Modify an existing icon on the taskbar.
In each case, either a True value is returned if the message was executed
successfully or a False value is returned if an error occurred in the
attempt to process the message.
The second argument required by the Shell_NotifyIcon function is the
address of a NOTIFYICONDATA structure. This structure contains the
information used by the Shell_NotifyIcon function to modify the taskbar
as specified. This structure must be defined as follows:
Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * pnTOOLTIP_SZ
End Type
where:
cbSize The size of the NOTIFYICONDATA structure itself.
hWnd The handle of the window that will receive the
notification messages associated with an icon
on the taskbar.
wID An application-defined identifier of the taskbar icon.
uFlags An array of flags indicating which of the other
structure members contain valid data. The uFlags
argument can be a combination of the following:
NIF_ICON hIcon is valid.
NIF_MESSAGE uCallbackMessage is valid.
NIF_TIP szTip is valid.
uCallbackMessage An application defined message identifier.
When a mouse event occurs over the icon, the identifier is used for
notification messages sent to the hWnd window:
hIcon The handle of the taskbar icon
szTip The text for the taskbar icon's tooltip
Note that the Shell_NotifyIcon function is used to send a particular
message to the system. The individual message you send to the taskbar
adds a new icon, deletes an existing icon, or modifies an existing icon.
You can add a new icon to the Windows 95 taskbar by sending a NIM_ADD
message. The newly added icon appears on either the right side or the
bottom of the toolbar. If the Show Clock option of the taskbar is
selected, the new taskbar icon is set to the immediate left of the Clock
applet icon. Each time you add a new icon to the taskbar, any and all
existing taskbar icons are shifted one position to the left.
The NOTIFYICONDATA structure must be used when adding, deleting, or
modifying icons on the taskbar. This structure contains the information
necessary for each particular message you want to send. When adding new
icons to the taskbar, for example, the NOTIFYICONDATA structure must
contain the handle of the new icon, the identifier of the icon, and
optionally, the text for the icon's tooltip. In addition, if your
application needs to receive mouse messages for the taskbar icon, then
the NOTIFYICONDATA structure must also include the identifier of the
callback message that should be sent to your application's window.
To process the incoming callback messages, however, you must use a
subclassing control such as Message Blaster. This third-party control
will allow your Visual Basic application to detect when the system has
received a mouse message for your taskbar icon. The wParam argument
contains the identifier of the taskbar icon that received the mouse
message, and the lParam argument contains the actual message. This
functionality allows you to insert several icons on the taskbar from
within a single Visual Basic application. However, it is highly
recommended that you not go overboard when adding these new icons to
the taskbar.
To add a new icon to the taskbar, you need to store information about
the icon in the NOTIFYICONDATA structure. In the example program below,
you use the CreateNewIcon function to set the values in the
NOTIFYICONDATA structure for your new taskbar icon. This function is
shown here:
Sub CreateNewIcon(OurWindow As Object, OurMsg As Long, OurToolTip As String)
On Error Resume Next
Dim X As Long
NewIcon.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
NewIcon.szTip = OurToolTip & Chr$(0)
NewIcon.hWnd = OurWindow.hWnd
NewIcon.uID = OurWindow.Icon
NewIcon.uCallbackMessage = OurMsg
NewIcon.hIcon = OurWindow.Icon
NewIcon.cbSize = Len(NewIcon)
X = Shell_NotifyIcon(NIM_ADD, NewIcon)
End Sub
In the routine shown above, notice that several steps have been taken
before you actually run the Shell_NotifyIcon function. The cbSize field
of the NOTIFYICONDATA structure is set to the actual size of the
structure. This is not an optional step. You also tell your application
that you want to capture and later process all mouse messages received
by the taskbar icon of your application. In addition, you tell the
Shell_NotifyIcon function that you want to use the icon specified in
the form's Icon property (this is the icon you will see on the taskbar
when the example program is run). You also tell Shell_NotifyIcon which
messages you need to processin this case, you want your icon to display
a tooltip when the mouse pointer is moved over the icon, you want the
icon itself to be displayed on the taskbar, and you want to process
incoming mouse messages.
Alternatively, when you want to remove an icon from the taskbar, you send
a NIM_DELETE message to your window. You do not need to modify the
contents of the NOTIFYICONDATA structure because that structure already
contains the data used by the program to add the new icon to the taskbar.
After the NIM_DELETE message is processed by the system, the icon is
removed from the taskbar.
Example Program
This program shows how to add a new icon to the Windows 95 taskbar. In
addition, it shows how to remove the newly added icon and to receive
callback messages, using the Message Blaster custom control, from the
new taskbar icon.
1. Create a new project in Visual Basic. Form1 is created by default.
2. Set the following properties to the specified values for Form1:
BorderStyle 2-Sizable
MaxButton True
MinButton True
ShowInTaskBar True
WhatsThisHelp False
WindowState 0-Normal
Select a new icon for this form (in the Icon property) to any icon that
you want. This is the icon that appears on the taskbar when you run the
example program.
3. Add the following code to the Form_Load event for Form1:
Private Sub Form_Load()
On Error Resume Next
MessageBlaster1.hWndTarget = Me.hwnd
MessageBlaster1.AddMessage WM_USER, POSTPROCESS
CreateNewIcon Me, WM_USER, "My Little App"
End Sub
4. Add a Message Blaster control to Form1. MessageBlaster1 is created
by default.
5. Add the following code to the MessageBlaster1_Message event (note
that the Private statement must be typed as a single line of code):
Private Sub MessageBlaster1_Message(ByVal hwnd As Long, ByVal Msg As Long,
wParam As Long, lParam As Long, nPassage As Integer, lReturnValue As Long)
On Error Resume Next
Select Case lParam
Case WM_LBUTTONDOWN
MsgBox "My Little App is running!", , App.Title
Case WM_RBUTTONDOWN
PopupMenu mnuMain, 0, , , mnuClose
Case WM_USER + 1
End
End Select
End Sub
6. From the Visual Basic Tools menu, select Menu Editor. Create a menu
with the following items:
Caption &Main
Name mnuMain
Caption &Date
Name mnuDate
Caption &Time
Name mnuTime
Caption &Close
Name mnuClose
7. Add the following code to the Click event for mnuClose:
Private Sub mnuClose_Click()
On Error Resume Next
DeleteOldIcon
SendMessage hwnd, WM_USER, 0, WM_USER + 1
End Sub
8. Add the following code to the Click event for mnuDate:
Private Sub mnuDate_Click()
MsgBox "Today is: " & Date, , App.Title
End Sub
9. Add the following code to the Click event mnuTime:
Private Sub mnuTime_Click()
MsgBox "Time is: " & Time, , App.Title
End Sub
10. From the Visual Basic Insert menu, select Module to create a new
module. Module1.Bas is created by default.
11. Add the following code to Module1.Bas (note that the Declare statement
must be typed as a single line of code):
Option Explicit
Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA"
(ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Public Const NIF_ICON = &H2
Public Const NIF_MESSAGE = &H1
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIM_DELETE = &H2
Public Const MyToolTip As Integer = 64
Type NOTIFYICONDATA
cbSize As Long
hWnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * MyToolTip
End Type
Public NewIcon As NOTIFYICONDATA
12. Create a new subroutine called CreateNewIcon. Add the following code
to this subroutine:
Sub CreateNewIcon(OurWindow As Object, OurMsg As Long, OurToolTip As String)
On Error Resume Next
Dim X As Long
NewIcon.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
NewIcon.szTip = OurToolTip & Chr$(0)
NewIcon.hWnd = OurWindow.hWnd
NewIcon.uID = OurWindow.Icon
NewIcon.uCallbackMessage = OurMsg
NewIcon.hIcon = OurWindow.Icon
NewIcon.cbSize = Len(NewIcon)
X = Shell_NotifyIcon(NIM_ADD, NewIcon)
End Sub
13. Create a new subroutine called DeleteIcon. Add the following code to
this subroutine:
Sub DeleteOldIcon()
On Error Resume Next
Dim X As Long
X = Shell_NotifyIcon(NIM_DELETE, NewIcon)
End Sub
14. Create a new routine called Main. Add the following code to this
function:
Sub Main()
Load Form1
End Sub
15. From the Visual Basic Tools menu, select Options. From the Options
windows, select Project. Change the Startup Form to Sub Main. Click
OK to save the change to the project.
Run the example program by pressing F5. Notice the icon for the program
is on the taskbar. Move the cursor over this taskbar icon and the tooltip
text "My Little App" appears. When you use the left mouse button to click
the icon, a message box appears that tells you "My Little App is
running!". Click the OK command button. When you click the right mouse
button on the icon, a pop-up menu appears, listing three options: display
the current date, display the current time, and close the application.
Note that when you close the application, the icon is removed from the
Windows 95 taskbar.
Return