Насколько я могу судить, не существует прямого способа отобразить Значок новой почты с помощью VBA. Однако вы можете добавить a другой значок в трее по требованию. Я уверен, что есть способ получить похожий значок, используя LoadIcon или аналогичную функцию Win32, но я не смог понять, как это сделать.
Обратите внимание, что это работает только в 32-битном Office (я не смог заставить его работать в 64-битном режиме, поэтому вам не повезло в этом отношении - даже на форумах Microsoft , эта проблема не решена. Опять же, я думаю о переполнении стека больше, чем о форумах Microsoft).
- Зайдите в Инструменты-> Макросы-> Редактор Visual Basic, нажмите Вид-> Проводник проекта.
- В левом окне Project щелкните правой кнопкой мыши «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.
Чтобы использовать эти функции в правиле, вы можете создать новое правило: Инструменты-> Правила и оповещения-> Новое правило, выберите критерии на первых двух экранах, а затем на экране «Выбор действий». выберите «запустить скрипт». Когда вы добавите это в свое правило и нажмете подчеркнутое «запустить скрипт», вы должны увидеть две функции: «ShowIconInTray» и «HideIconInTray».
Когда вы используете ShowIconInTray в вашем правиле, значок должен появляться при запуске правила, а когда вы наводите курсор мыши на него, он должен исчезнуть (мне было сложно дать другие функции значку, потому что нет дескриптора окна для подключите его к тому, чтобы можно было получать и обрабатывать события мыши на значке).
Возможно, вам придется проверить безопасность Outlook (Инструменты-> Макросы-> Безопасность). Я думаю, что Outlook 2007 поставляется с высокой степенью безопасности. Чтобы макросы всегда запускались, вы можете выбрать «Без проверки безопасности для макросов» или «Предупреждения для макросов». Подписать VBA легко, но это выходит за рамки этого ответа.
Это не мой любимый код, и он несколько хакерский; но Shell_NotifyIcon не был специально разработан для использования в VBA, и вы не можете использовать функции Win32 в VBScript. Лучший альтернативный ответ, вероятно, будет включать надстройку VSTO, но вы не можете «вставить» надстройку в ответ - плюс для этого потребуется Visual Studio.