Outlook Inspector窗口在通过网页上的Javascript Mailto代码触发时不会自动关闭

时间:2016-06-08 16:09:38

标签: javascript vba outlook outlook-vba

我正在尝试自动关闭Outlook Inspector窗口,该窗口在单击与其链接的Javascript mailto:调用(注入)的按钮后自动打开。我以为我正在使用正确的Outlook事件,但也许不是。我目前正在做的是订阅Inspectors_NewInspectorInspector_Activate事件,以便检测窗口何时打开/变得可见,然后我尝试从Inspector_Activate内关闭它事件。我需要电子邮件的唯一原因是为了触发其他VBA代码在点击的Web浏览器中的特定按钮上执行,以及阅读电子邮件的主题。由于出现(s / ed)没有直接的方法从Javascript控制Outlook,不涉及使用Internet Explorer(我使用的是Chrome)或Microsoft Office API,我得出结论,这是最好的方法我去吧。

我目前的问题:

我可以从新的电子邮件/检查器窗口中读取数据,但无法始终让窗口自动关闭。它只会间歇性地自动关闭。其他时候我留下了一个冻结的Inspector窗口,我只能通过单击窗口的红色X来关闭它。在窗口中甚至没有其他东西可以点击。

Inspector Window

我尝试了什么:

我试图在整个代码中的各个位置拨打电话关闭窗口;一些人犯了错误而其他人什么都没做。我在整个代码中的各个位置尝试了putt DoEvents循环;所有人都在等待加载不同的东西,但它们要么没有效果,要么陷入无限循环中。我甚至无法告诉你在尝试解决这个问题时我曾多次将Outlook崩溃。更重要的是,在尝试调试问题时,我收到了与成功案例相同的读数,因为我做了一个不成功的案例。下面的第一部分是成功执行,其中代码自动关闭窗口,第二部分窗口在代码完成后仍然打开。

立即窗口中的输出:

m_Inspectors_NewInspector Event: 1
Beginning m_Inspectors_Activate Event: 1
Closing
Should be closed
End m_Inspectors_Activate Event: 0
------------------------------------------------------
m_Inspectors_NewInspector Event: 1
Beginning m_Inspectors_Activate Event: 1
Closing
Should be closed
End m_Inspectors_Activate Event: 0
------------------------------------------------------

我目前拥有的内容:

以下是ThisOutlookSession中的代码:

Private WithEvents m_Inspectors As Inspectors
Private WithEvents m_Inspector As Inspector
Private WithEvents Mail As MailItem

Public Sub Initialize_handler()
    Set m_Inspectors = Application.Inspectors
End Sub

Private Sub m_Inspectors_NewInspector(ByVal Inspector As Inspector)
    If TypeOf Inspector.CurrentItem Is Outlook.MailItem Then
        'Handle emails only
        Set m_Inspector = Inspector
        Debug.Print "m_Inspectors_NewInspector Event: " & m_Inspectors.Count
    End If
End Sub

Private Sub m_Inspector_Activate()
    Debug.Print "Beginning m_Inspectors_Activate Event: " & m_Inspectors.Count
    Dim Mail As Object
    DoEvents
    Set Mail = m_Inspector.CurrentItem
    If Mail Is Nothing Then Debug.Print "Mail is Nothing": Exit Sub

    If Mail.To = "velo@automated.com" Then
        Dim clipB As String, DataObj As MsForms.DataObject
        Select Case Mail.Subject
            Case "Import", "Export"
                Set DataObj = New MsForms.DataObject
                DataObj.GetFromClipboard
                clipB = DataObj.GetText(1)
                'MsgBox (IIf(Mail.Subject = "Import", "Import for ", "Export for ") & clipB)
                Mail.Close olDiscard
                Set Mail = Nothing
                'Set m_Inspector = Nothing
            Case Else
                MsgBox ("Hmm")
                Exit Sub
        End Select
    End If
    Debug.Print "End m_Inspectors_Activate Event: " & m_Inspectors.Count
    Debug.Print "------------------------------------------------------"
    Set m_Inspector = Nothing
End Sub

Private Sub Mail_Close(Cancel As Boolean)
    Cancel = False
End Sub

Private Sub m_Inspector_Close()
    'MsgBox ("Close!")
    Debug.Print "Closing"
    'Set m_Inspector = Nothing
    Debug.Print "Should be closed"
End Sub

为了完整起见,这是我注入的Javascript代码的相关部分:

$(document).on('click', 'button.btn-large:nth-child(3)', function(){
    var fullsupplier;
    fullsupplier = document.getElementById("asinum").innerHTML + " " + document.getElementById("supplierName").innerHTML;
    //alert(fullsupplier);
    copyTextToClipboard(fullsupplier);
    window.location.href = "mailto:velo@automated.com?subject=Import";
});

$(document).on('click', 'button.btn-large:nth-child(1)', function(){
    var fullsupplier;
    fullsupplier = document.getElementById("asinum").innerHTML + " " + document.getElementById("supplierName").innerHTML;
    //alert(fullsupplier);
    copyTextToClipboard(fullsupplier);
    window.location.href = "mailto:velo@automated.com?subject=Export";
});

我的问题:

我做错了什么?如何使Inspector窗口始终自动关闭而不是间歇性关闭?

2 个答案:

答案 0 :(得分:1)

问题是从外部进程创建的电子邮件(例如mailto:links,从Word发送等)不会触发NewInspector事件。您必须使用计时器来检测Inspectors.Count何时更改并将挂钩设置到新添加的Inspector中。然后你可以捕捉它的事件。

答案 1 :(得分:0)

除了Eric的回答之外,您还需要确保您有一个检查员列表以及邮件项目 - 可以同时打开多个项目。