I was having the hardest time configuring outlook to show the new mail message icon only when I wanted it to. I have several rules/filters set up that I didn\'t want to sho
As far as I've been able to tell, there is no direct way to display the New Mail Icon using VBA. However, you can add a different tray icon on-demand. I'm sure there is a way to get a similar-looking icon to appear by using LoadIcon or a similar Win32 function, but I have not been able to figure out how.
Note that this only works in 32-bit Office (I wasn't able to get it to work in 64-bit; so you're out of luck in that regard -- even in the Microsoft forums, that issue is unresolved. Then again, I think more highly of Stack Overflow than of the Microsoft Forums).
and paste the following code:
'Some code borrowed from:
'http://support.microsoft.com/kb/176085
Public Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uId As Long
uFlags As Long
uCallBackMessage As Long
hIcon As Long
szTip As String * 64
End Type
Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2
Public Const NIF_MESSAGE = &H1
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
Public Const IDI_APPLICATION = 32512&
Public Const IDI_ASTERISK = 32516&
Public Const IDI_EXCLAMATION = 32515&
Public Const IDI_HAND = 32513&
Public Const IDI_ERROR = IDI_HAND
Public Const IDI_INFORMATION = IDI_ASTERISK
Public Const IDI_QUESTION = 32514&
Public Const IDI_WARNING = IDI_EXCLAMATION
Public Const IDI_WINLOGO = 32517&
Public Const WM_MOUSEMOVE = &H200
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Const WM_RBUTTONDBLCLK = &H206
Public Declare Function SetForegroundWindow Lib "user32" _
(ByVal hwnd As Long) As Long
Public Declare Function Shell_NotifyIcon Lib "shell32" _
Alias "Shell_NotifyIconA" _
(ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWndParent As Long, ByVal hwndChildAfter As Long, _
ByVal lpszClass As String, ByVal lpszWindow As String) As Long
Public Declare Function LoadIcon Lib "user32" Alias "LoadIconA" (ByVal hInstance As Long, ByVal lpIconName As Long) As Long
Public nid As NOTIFYICONDATA
Public Sub ShowNotifyIcon()
With nid
.cbSize = Len(nid)
.hwnd = 0
'If you un-comment this line below the icon won't disappear when you mouse over it. You will need to use the HideNotifyIcon() function to make it disappear
'.hwnd = FindWindowEx(0&, 0&, "mspim_wnd32", "Microsoft Outlook")
.uId = vbNull
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.uCallBackMessage = WM_MOUSEMOVE
.hIcon = LoadIcon(0&, IDI_APPLICATION)
.szTip = "A message has arrived" & vbNullChar
End With
Shell_NotifyIcon NIM_ADD, nid
End Sub
Public Sub HideNotifyIcon()
Shell_NotifyIcon NIM_DELETE, nid
End Sub
Now, to be able to use these in an Outlook rule, you need to double-click ThisOutlookSession, and paste the following code:
Public Sub ShowNewMailIcon(Item As Outlook.MailItem)
Call ShowNotifyIcon
End Sub
Public Sub HideNewMailIcon(Item As Outlook.MailItem)
Call HideNotifyIcon
End Sub
Now you can save, and close the Visual Basic window.
To use these functions in a rule, you can then create a new rule: Tools->Rules and Alerts->New Rule, select your criteria on the first 2 screens, then on the "Select action(s)" screen, choose "run a script". When you add that to your rule, and click the underlined "run a script", you should then see the 2 functions "ShowIconInTray" and "HideIconInTray".
When you use ShowIconInTray in your rule, the icon should appear when the rule runs, and when you mouse-over it, it should disappear (I was challenged in giving other functionality to the icon, because there is no window handle to connect it to that could receive and process the mouse events on the icon).
You may need to check Outlook's security (Tools->Macros->Security). I think Outlook 2007 comes preconfigured with high security. To get the macros to always run, you can select "No security check for macros" or "warnings for macros". Signing VBA is easy but beyond the scope of this answer.
This is not my favorite code ever, and it's somewhat hackish; but Shell_NotifyIcon wasn't really designed to be used in VBA, and you can't use Win32 functions in VBScript. The best alternative answer would probably include a VSTO add-in, but you can't really "paste" an add-in to an answer-- plus it would require Visual Studio.