6 votes

Afficher une nouvelle icône de courrier dans la barre des tâches de Windows à l'aide de VBScript

J'ai eu beaucoup de mal à configurer Outlook pour qu'il n'affiche l'icône du nouveau message que lorsque je le souhaite. J'ai plusieurs règles/filtres configurés que je ne voulais pas afficher, mais ils l'ont toujours fait. J'ai tout essayé, mais ce n'est pas ma question. Ce que j'ai trouvé comme bonne solution était de créer un vbs script qui appelait un bash script que j'utilise pour me notifier. J'appelle ce code dans ma règle catch-all et j'ai toutes les autres règles qui se terminent tôt. Cela fonctionne plutôt bien. Ce que j'aimerais vraiment, cependant, c'est afficher la nouvelle icône de courrier (enveloppe) dans la barre des tâches. Je suis vraiment ignorant de vb, vba, vbs. Mais si quelqu'un peut m'envoyer le code dont j'ai besoin dans un fichier, je serais ravi de tenter le coup. MERCI !

6voto

transistor1 Points 1684

D'après ce que j'ai pu constater, il n'y a pas de moyen direct d'afficher el Nouvelle icône de courrier électronique à l'aide de VBA. Cependant, vous pouvez ajouter a une icône différente dans la barre des tâches à la demande. Je suis sûr qu'il existe un moyen de faire apparaître une icône d'apparence similaire en utilisant LoadIcon ou une fonction Win32 similaire, mais je n'ai pas réussi à trouver comment.

Notez que cela ne fonctionne qu'en Office 32 bits (je n'ai pas réussi à le faire fonctionner en 64 bits ; vous n'avez donc pas de chance à cet égard - même dans le cadre de l'option Forums Microsoft cette question n'est pas résolue. Mais encore une fois, j'ai une meilleure opinion de Stack Overflow que des forums de Microsoft).

  1. Allez dans Outils->Macros->Éditeur Visual Basic, cliquez sur Affichage->Explorateur de projet.
  2. Dans la fenêtre de gauche du projet, cliquez à droite sur "Project1" et sélectionnez Insertion->Module.
  3. Double-cliquez sur le nouveau module que vous venez de créer,

et collez le code suivant :

'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

Maintenant, pour pouvoir les utiliser dans une règle Outlook, vous devez double-cliquer sur ThisOutlookSession, et coller le code suivant :

Public Sub ShowNewMailIcon(Item As Outlook.MailItem)
        Call ShowNotifyIcon
End Sub

Public Sub HideNewMailIcon(Item As Outlook.MailItem)
        Call HideNotifyIcon
End Sub

Vous pouvez maintenant enregistrer et fermer la fenêtre Visual Basic.

Pour utiliser ces fonctions dans une règle, vous pouvez ensuite créer une nouvelle règle : Outils->Règles et alertes->Nouvelle règle, sélectionnez vos critères sur les 2 premiers écrans, puis sur l'écran "Sélectionner une ou plusieurs actions", choisissez "exécuter un script". Lorsque vous ajoutez cela à votre règle, et que vous cliquez sur le "run a script" souligné, vous devriez alors voir les 2 fonctions "ShowIconInTray" et "HideIconInTray".

enter image description here

Lorsque vous utilisez ShowIconInTray dans votre règle, l'icône doit apparaître lorsque la règle s'exécute, et disparaître lorsque vous passez la souris dessus (j'ai eu du mal à donner d'autres fonctionnalités à l'icône, car il n'y a pas de handle de fenêtre auquel la connecter qui pourrait recevoir et traiter les événements de souris sur l'icône).

Vous devrez peut-être vérifier la sécurité d'Outlook (Outils->Macros->Sécurité). Je pense qu'Outlook 2007 est préconfiguré avec une sécurité élevée. Pour que les macros s'exécutent toujours, vous pouvez sélectionner "Aucun contrôle de sécurité pour les macros" ou "Avertissements pour les macros". La signature de VBA est facile mais dépasse le cadre de cette réponse.

Ce n'est pas le code que je préfère, et c'est un peu bidouillé ; mais Shell_NotifyIcon n'a pas vraiment été conçu pour être utilisé en VBA, et vous ne pouvez pas utiliser les fonctions Win32 en VBScript. La meilleure réponse alternative serait probablement d'inclure un add-in VSTO, mais vous ne pouvez pas vraiment "coller" un add-in dans une réponse - de plus, cela nécessiterait Visual Studio.

3voto

Krishna Points 749

Créer c : \scheduletools\mailcheck.vbs avec le contenu ci-dessous

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

une façon de l'exécuter automatiquement est d'utiliser le planificateur de tâches.

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

vous pouvez spécifier plusieurs programmes. Un fichier VB script peut être exécuté directement à partir du planificateur de tâches de Windows. Dans le planificateur de tâches, sélectionnez Ajouter une nouvelle tâche planifiée. En suivant les invites, naviguez pour sélectionner votre fichier .vbs. Nommez votre tâche et sélectionnez votre calendrier pour exécuter la tâche quotidiennement et sélectionnez l'heure d'exécution. Cela fonctionne de la même manière que si vous vouliez planifier un fichier .bat.

Utilisez le chemin d'accès absolu au fichier dans la commande.

ou créer un fichier .bat appelant votre fichier vbs

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

veuillez noter que si vous avez des règles au niveau d'exchange pour déplacer votre courrier vers différents dossiers, vous devrez alors rechercher tous ces dossiers pour les nouveaux courriers.

J'espère que cela vous aidera

3voto

79E09796 Points 552

Ajoutez d'abord une référence aux contrôles et à la notification Microsoft shell, puis ajoutez un module à votre projet outlook vba avec le code suivant. Il met à disposition une fonction pour afficher et masquer l'icône de la barre d'état système (actuellement définie sur c : \temp\msn.ico ), que vous devez modifier pour afficher une icône de messagerie appropriée.

' 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

Ver ici y ici pour le code original.

1voto

David Gausmann Points 747

J'ai eu le même problème, mais depuis Windows 7, je ne cherche pas d'icône dans la barre d'état système, je regarde plutôt sur le bouton de la tâche Outlook.

J'ai écrit le script suivant pour notifier à Windows que le bouton de la barre des tâches d'outlook doit se mettre à clignoter jusqu'à ce que la fenêtre d'outlook devienne active. Le script doit être exécuté à partir de la règle.

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

C'est une solution adaptée à mon problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X