使用VBScript在Windows任务栏中显示新邮件图标

and*_*bd1 6 outlook vba outlook-vba

我最困难的时候是配置outlook以便在我想要的时候显示新的邮件消息图标.我有几个规则/过滤器设置,我不想显示,但他们总是这样做.我尝试了一切,但这不是我的问题.我发现一个好的解决方案是创建一个vbs脚本,调用我用来通知我的bash脚本.我在我的catch-all规则中调用此代码,并让所有其他规则提前退出.它工作得很好.但是,我真正喜欢的是在任务栏中显示新的邮件图标(信封).我真的不知道vb,vba,vbs.但如果有人可以在文件中发送我需要的代码,我很乐意尝试一下.谢谢!

tra*_*or1 6

据我所知,没有直接的方法来显示使用VBA 新邮件图标.但是,您可以添加一个点播不同的托盘图标.我确信有一种方法可以通过使用LoadIcon或类似的Win32函数来显示类似外观的图标,但我无法弄清楚如何.

请注意,这仅适用于32位Office(我无法使其在64位中运行;因此您在这方面运气不佳 - 即使在Microsoft论坛中,该问题仍未得到解决.然后再次,我认为Stack Overflow比微软论坛更为重要.

  1. 转到工具 - >宏 - > Visual Basic编辑器,单击视图 - >项目浏览器.
  2. 在左侧的Project窗口中,右键单击"Project1"并选择Insert-> Module.
  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
Run Code Online (Sandbox Code Playgroud)

现在,为了能够在Outlook规则中使用这些,您需要双击ThisOutlookSession,并粘贴以下代码:

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

Public Sub HideNewMailIcon(Item As Outlook.MailItem)
        Call HideNotifyIcon
End Sub
Run Code Online (Sandbox Code Playgroud)

现在您可以保存并关闭Visual Basic窗口.

要在规则中使用这些功能,您可以创建新规则:工具 - >规则和警报 - >新规则,在前2个屏幕上选择您的条件,然后在"选择操作"屏幕上,选择"运行脚本".当您将其添加到规则中,然后单击带下划线的"运行脚本"时,您应该看到2个函数"ShowIconInTray"和"HideIconInTray".

在此输入图像描述

当您在规则中使用ShowIconInTray时,图标应该在规则运行时出现,当您将鼠标悬停在它上面时,它应该消失(我在向图标提供其他功能时遇到了挑战,因为没有窗口句柄将其连接到可以在图标上接收和处理鼠标事件.

您可能需要检查Outlook的安全性(工具 - >宏 - >安全性).我认为Outlook 2007预先配置了高安全性.要使宏始终运行,可以选择"不对宏进行安全检查"或"对宏进行警告".签署VBA很容易,但超出了本答案的范围.

这不是我最喜欢的代码,而且有些晦涩难懂; 但是Shell_NotifyIcon并不是真的设计用于VBA,而且你不能在VBScript中使用Win32函数.最好的替代答案可能包括一个VSTO加载项,但你不能真正"粘贴"一个加载项到答案 - 加上它需要Visual Studio.


Kri*_*hna 3

使用以下内容创建 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
Run Code Online (Sandbox Code Playgroud)

自动运行它的一种方法是通过任务调度程序

(start -> run -> (type)tasks -> enter)
Run Code Online (Sandbox Code Playgroud)

您可以指定多个计划。VB 脚本文件可以直接从 Windows 任务计划运行。在任务计划程序中,选择添加新的计划任务。按照提示,浏览并选择您的 .vbs 文件。为您的任务命名并选择每天运行该任务的计划,并选择一天中的运行时间。它的工作方式与您想要安排 .Bat 文件的方式相同。

在命令中使用绝对文件路径。

或创建一个调用您的 vbs 文件的 .bat 文件

cscript //nologo c:\schedulttools\mailcheck.vbs
Run Code Online (Sandbox Code Playgroud)

请注意,如果您有交换级别规则将邮件移动到不同的文件夹,那么您将需要在所有这些文件夹中查找新邮件。

希望这有帮助