将 Outlook 事件与自动化结合使用

Using Outlook events with automation

Using Events with Automation 解释了如何将 Outlook 事件与自动化结合使用。但是我不明白如何将该代码实现到我的项目中。

我想使用 InspectorBeforeMinimizeEvent 方法,如 Inspector.BeforeMinimize Event (Outlook)

中所述

每当用户 moves/resizes/maximizes/minimizes 手动检查器时,MessageBox 应该弹出。

以下代码用于测试:

Imports Microsoft.Office.Interop

Public Class Form1

    Public WithEvents myIns As Outlook.Inspector

    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load

        Process.Start("Outlook.exe")
        Threading.Thread.Sleep(3000)
        Dim olApp As New Outlook.Application

        Dim myMailItem As Outlook.MailItem
        myMailItem = CType(olApp.CreateItem(Outlook.OlItemType.olMailItem), Outlook.MailItem)
        myMailItem.Subject = "Hello"
        myMailItem.To = "anybody@example.com"
        myMailItem.Body = "Hi there..."

        Dim myIns As Outlook.Inspector
        myIns = myMailItem.GetInspector

        myIns.Display(False)

        Dim myWord As Word.Document
        myWord = CType(myIns.WordEditor, Word.Document)

        Dim mySel As Word.Selection
        mySel = myWord.Application.Selection

        Threading.Thread.Sleep(10000)

        'Following line just for testing. Normally following line doesnt exist in my original code. The real scenario is the user minimizes the inspector manually.
        myIns.WindowState = Outlook.OlWindowState.olMinimized

        myWord.InlineShapes.AddPicture(FileName:="C:\Example.png", LinkToFile:=False, SaveWithDocument:=True, Range:=mySel.GoTo(What:=Word.WdGoToItem.wdGoToLine, Which:=Word.WdGoToDirection.wdGoToLast, Count:=-4))

        'myMailItem.Send()

    End Sub

End Class

事件代码:

Private Sub myIns_BeforeMinimize(Cancel As Boolean)
     MessageBox.Show("You are minimizing this inspector.", "Title", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly)
End Sub

在class级别为Inspector对象声明一个变量并将其设置为.GetInspector方法的return,然后将您的代码放在实际事件中:

Public WithEvents myIns As Outlook.Inspector

Private Sub myIns_BeforeMinimize(Cancel As Boolean)
     'Your code here
End Sub

要让它工作,您需要为 Activate 添加处理程序,并且每次 MailItem 被激活时,您将设置 WindowState:

Private Sub myIns_Activate() Handles myIns.Activate
    myIns.WindowState = Outlook.OlWindowState.olMinimized
End Sub

我还要删除这些行:

Process.Start("Outlook.exe")
Threading.Thread.Sleep(3000)

Dim myIns As Outlook.Inspector

Threading.Thread.Sleep(10000)

您不需要 Process.Start,因为它由 Dim olApp As New Outlook.Application 处理。您也不需要 Dim myIns As Outlook.Inspector,因为它由 Public WithEvents myIns As Outlook.Inspector 处理。我很欣赏 Threading.Thread.Sleep 行可能用于测试目的。

您的代码看起来类似于:

Imports Microsoft.Office.Interop

Public Class Form1

    Public WithEvents myIns As Outlook.Inspector

    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load

        Dim olApp As New Outlook.Application

        Dim myMailItem As Outlook.MailItem = CType(olApp.CreateItem(Outlook.OlItemType.olMailItem), Outlook.MailItem)
        myMailItem.Subject = "Hello"
        myMailItem.To = "anybody@example.com"
        myMailItem.Body = "Hi there..."

        myIns = myMailItem.GetInspector
        myIns.Display(False)

        Dim myWord As Word.Document
        myWord = CType(myIns.WordEditor, Word.Document)

        Dim mySel As Word.Selection
        mySel = myWord.Application.Selection

        myWord.InlineShapes.AddPicture(FileName:="C:\Example.png", LinkToFile:=False, SaveWithDocument:=True, Range:=mySel.GoTo(What:=Word.WdGoToItem.wdGoToLine, Which:=Word.WdGoToDirection.wdGoToLast, Count:=-4))

        myMailItem.Send()

    End Sub

    Private Sub myIns_Activate() Handles myIns.Activate
        myIns.WindowState = Outlook.OlWindowState.olMinimized
    End Sub

End Class