据我所知,没有直接的方法可以使用 VBA 显示 新邮件图标。但是,您可以按需添加一个不同的托盘图标。我确信有一种方法可以通过使用 LoadIcon 或类似的 Win32 函数来显示类似外观的图标,但我无法弄清楚如何。
请注意,这只适用于 32 位 Office(我无法让它在 64 位中工作;所以你在这方面不走运 - 即使在 Microsoft forums 中,那个问题未解决。再说一次,我认为 Stack Overflow 比 Microsoft 论坛更高)。
- 进入Tools->Macros->Visual Basic Editor,点击View->Project explorer。
- 在左侧项目窗口中,右键单击“Project1”并选择“插入”->“模块”。
- 双击刚刚创建的新模块,
并粘贴以下代码:
'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
现在,为了能够在 Outlook 规则中使用这些,您需要双击 ThisOutlookSession,然后粘贴以下代码:
Public Sub ShowNewMailIcon(Item As Outlook.MailItem)
Call ShowNotifyIcon
End Sub
Public Sub HideNewMailIcon(Item As Outlook.MailItem)
Call HideNotifyIcon
End Sub
现在您可以保存并关闭 Visual Basic 窗口。
要在规则中使用这些功能,您可以创建一个新规则:工具->规则和警报->新规则,在前 2 个屏幕上选择您的条件,然后在“选择操作”屏幕上,选择“运行脚本”。当您将其添加到规则中并单击带下划线的“运行脚本”时,您应该会看到 2 个函数“ShowIconInTray”和“HideIconInTray”。
当您在规则中使用 ShowIconInTray 时,该图标应该会在规则运行时出现,而当您将鼠标悬停在它上面时,它应该会消失(我在为图标提供其他功能时遇到了挑战,因为没有窗口句柄将其连接到可以接收和处理图标上的鼠标事件)。
您可能需要检查 Outlook 的安全性(工具->宏->安全性)。我认为 Outlook 2007 预配置了高安全性。要使宏始终运行,您可以选择“不对宏进行安全检查”或“宏警告”。签署 VBA 很容易,但超出了此答案的范围。
这不是我最喜欢的代码,而且有点骇人听闻;但是 Shell_NotifyIcon 并不是真正设计用于 VBA,而且您不能在 VBScript 中使用 Win32 函数。最佳替代答案可能包括 VSTO 加载项,但您不能真正将加载项“粘贴”到答案中——而且它需要 Visual Studio。