Отображение нового значка почты на панели задач Windows с использованием VBScript - PullRequest
6 голосов
/ 21 февраля 2012

Мне было труднее всего настроить Outlook, чтобы отображать значок нового почтового сообщения только тогда, когда я этого хотел. У меня есть несколько правил / фильтров, которые я не хотел показывать, но они всегда показывали. Я перепробовал все, но это не мой вопрос. Хорошее решение я нашел в том, чтобы создать скрипт vbs, который называется bash, который я использую, чтобы уведомить меня. Я называю этот код в своем правиле для всех и у меня все остальные правила выходят рано. Это работает довольно хорошо. Однако мне бы очень хотелось, чтобы на панели задач отображался значок новой почты (конверт). Я действительно не знаю VB, VBA, VBS. Но если кто-то может отправить код, который мне нужен, в файле, я бы с удовольствием попробовал. СПАСИБО!

Ответы [ 4 ]

6 голосов
/ 19 марта 2012

Насколько я могу судить, не существует прямого способа отобразить Значок новой почты с помощью VBA. Однако вы можете добавить a другой значок в трее по требованию. Я уверен, что есть способ получить похожий значок, используя LoadIcon или аналогичную функцию Win32, но я не смог понять, как это сделать.

Обратите внимание, что это работает только в 32-битном Office (я не смог заставить его работать в 64-битном режиме, поэтому вам не повезло в этом отношении - даже на форумах Microsoft , эта проблема не решена. Опять же, я думаю о переполнении стека больше, чем о форумах Microsoft).

  1. Зайдите в Инструменты-> Макросы-> Редактор Visual Basic, нажмите Вид-> Проводник проекта.
  2. В левом окне Project щелкните правой кнопкой мыши «Project1» и выберите «Вставить-> Модуль».
  3. Дважды щелкните новый модуль, который вы только что создали,

и вставьте следующий код:

'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».

enter image description here

Когда вы используете ShowIconInTray в вашем правиле, значок должен появляться при запуске правила, а когда вы наводите курсор мыши на него, он должен исчезнуть (мне было сложно дать другие функции значку, потому что нет дескриптора окна для подключите его к тому, чтобы можно было получать и обрабатывать события мыши на значке).

Возможно, вам придется проверить безопасность Outlook (Инструменты-> Макросы-> Безопасность). Я думаю, что Outlook 2007 поставляется с высокой степенью безопасности. Чтобы макросы всегда запускались, вы можете выбрать «Без проверки безопасности для макросов» или «Предупреждения для макросов». Подписать VBA легко, но это выходит за рамки этого ответа.

Это не мой любимый код, и он несколько хакерский; но Shell_NotifyIcon не был специально разработан для использования в VBA, и вы не можете использовать функции Win32 в VBScript. Лучший альтернативный ответ, вероятно, будет включать надстройку VSTO, но вы не можете «вставить» надстройку в ответ - плюс для этого потребуется Visual Studio.

3 голосов
/ 19 марта 2012

Сначала добавьте ссылку на элементы управления оболочки Microsoft и уведомление, затем добавьте модуль в ваш проект outlook vba со следующим кодом. Он предоставляет функцию, позволяющую отображать и скрывать значок в трее (в настоящее время установлен в c: \ temp \ msn.ico), который необходимо изменить, чтобы отобразить подходящий значок почты.

' Add reference to Microsoft shell controls and notification

Public Declare Function Shell_NotifyIconA Lib "shell32.dll" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Public hWnd As Long
Private Declare Function GetActiveWindow Lib "user32" () As Long


Public Type NOTIFYICONDATA
cbSize As Long ' Size of the NotifyIconData structure
hWnd As Long ' Window handle of the window processing the icon events
uID As Long ' Icon ID (to allow multiple icons per application)
uFlags As Long ' NIF Flags
uCallbackMessage As Long ' The message received for the system tray icon if NIF_MESSAGE specified. Can be in the range 0x0400 through 0x7FFF (1024 to 32767)
hIcon As Long ' The memory location of our icon if NIF_ICON is specifed
szTip As String * 64 ' Tooltip if NIF_TIP is specified (64 characters max)
End Type

' Shell_NotifyIconA() messages
Public Const NIM_ADD = &H0 ' Add icon to the System Tray
Public Const NIM_MODIFY = &H1 ' Modify System Tray icon
Public Const NIM_DELETE = &H2 ' Delete icon from System Tray

' NotifyIconData Flags
Public Const NIF_MESSAGE = &H1 ' uCallbackMessage in NOTIFYICONDATA is valid
Public Const NIF_ICON = &H2 ' hIcon in NOTIFYICONDATA is valid
Public Const NIF_TIP = &H4 'szTip in NOTIFYICONDATA is valid

Private Sub AddTrayIcon()
Dim nid As NOTIFYICONDATA

' nid.cdSize is always Len(nid)
nid.cbSize = Len(nid)
' Parent window - this is the window that will process the icon events
nid.hWnd = GetActiveWindow()
' Icon identifier
nid.uID = 0
' We want to receive messages, show the icon and have a tooltip
nid.uFlags = NIF_MESSAGE Or NIF_ICON Or NIF_TIP
' The message we will receive on an icon event
nid.uCallbackMessage = 1024
' The icon to display
Dim myPicture As IPictureDisp
strPath = "c:\temp\msn.ico"
Set myPicture = LoadPicture(strPath)
nid.hIcon = myPicture
' Our tooltip
nid.szTip = "Always terminate the tooltip with vbNullChar" & vbNullChar

' Add the icon to the System Tray
Shell_NotifyIconA NIM_ADD, nid


End Sub



Private Sub RemoveTrayIcon()
Dim nid As NOTIFYICONDATA

nid.hWnd = GetActiveWindow()
nid.cbSize = Len(nid)
nid.uID = 0 ' The icon identifier we set earlier

' Delete the icon
Shell_NotifyIconA NIM_DELETE, nid

End Sub

См. здесь и здесь для исходного кода.

3 голосов
/ 12 марта 2012

Создайте c: \ scheduletools \ mailcheck.vbs со следующим содержимым

Set otl = createobject("outlook.application")
Set session = otl.getnamespace("mapi")
session.logon ''use parameters if required - see below
''session.Logon "myUsername", "password", False, False

Set inbox = session.getdefaultfolder(6) '' 6 is for inbox
c = 0
For Each m In inbox.items
  If m.unread Then c = c + 1
Next
session.logoff
s = "s"
If c = 1 Then s = ""
Msgbox "You have " & c & " unread message" & s

. Один из способов автоматического запуска этого - через планировщик задач

(start -> run -> (type)tasks -> enter)

, вы можете указать несколько расписаний.Файл сценария VB может запускаться непосредственно из расписания задач Windows.В планировщике задач выберите Добавить новую запланированную задачу.Следуя инструкциям, выберите файл .vbs.Назовите свою задачу, выберите расписание для ежедневного запуска задачи и выберите время для запуска.Он работает так же, как если бы вы хотели запланировать .Bat файл.

Используйте в команде абсолютный путь к файлу.

или создайте файл .bat, который будет вызывать ваш vbs-файл

cscript //nologo c:\schedulttools\mailcheck.vbs

обратите внимание, что если у вас есть правила уровня обмена для перемещения почты в разные папки, то вам нужно будет просмотреть все этипапки для новой почты.

надеюсь, что эта помощь

1 голос
/ 13 октября 2014

У меня возникла та же проблема, но, начиная с Windows 7, я не ищу значок в трее, а вместо этого смотрю на кнопку задач Outlook.

Я написал следующий скрипт, чтобы уведомить окна о том, что кнопка панели задач Outlook будет мигать, пока окно Outlook не станет активным. Сценарий должен быть выполнен из правила.

Option Explicit

Private Type FLASHWINFO
  cbSize As Long
  hWnd As Long
  dwFlags As Long
  uCount As Long
  dwTimeout As Long
End Type

Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (ByRef pData As Any, ByVal nSize As Long)
Private Declare Function FlashWindowEx Lib "user32.dll" (ByRef pFlashWInfo As FLASHWINFO) As Boolean
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long

Private Const FLASHW_ALL As Long = &H3&
Private Const FLASHW_CAPTION As Long = &H1&
Private Const FLASHW_STOP As Long = &H0&
Private Const FLASHW_TIMER As Long = &H4&
Private Const FLASHW_TIMERNOFG As Long = &HC&
Private Const FLASHW_TRAY As Long = &H2&

Public Sub OnNotification(Item As Outlook.MailItem)
  Dim fwi As FLASHWINFO

  Call ZeroMemory(fwi, Len(fwi))
  fwi.cbSize = Len(fwi)
  fwi.hWnd = GetHWND
  fwi.dwFlags = FLASHW_TRAY Or FLASHW_TIMERNOFG
  fwi.uCount = -1
  fwi.dwTimeout = 0
  Call FlashWindowEx(fwi)
End Sub

Private Function GetHWND() As Long
  GetHWND = FindWindowEx(0, 0, vbNullString, Application.ActiveWindow.Caption)
End Function

Это подходящее решение для моей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...