10

语言/软件:

语言是VBA。该应用程序是 Access 2003(我也可以使用 Excel)和 Internet Explorer(在 Windows XP/7 上)。

问题:

我正在开发一个 Access 宏,它可以打开和操作我工作的企业的 Intranet 站点。

我可以创建新的 IE 窗口并在表单中填写数据,但我需要能够拦截和操作其他 IE 窗口,例如当我单击链接时打开的弹出窗口,当我选择一个选择元素的选项或页面加载时。

4

1 回答 1

5

这是我用来从标题中获取 IE 窗口的一些代码。它分为两个功能,因为我的一个用户遇到了一个非常奇怪的问题,即没有正确捕获错误。您可能(可能会)能够将私有函数的主体移动到公共函数中。

此外,您需要设置对 Microsoft Internet 控件的引用(这是 shdocvw.dll 或 ieframe.dll,具体取决于您的 Windows 版本),我建议您设置对 Microsoft HTML 对象库的引用以使其更容易拥有 IE 对象后遍历 DOM。

Function oGetIEWindowFromTitle(sTitle As String, _
                               Optional bCaseSensitive As Boolean = False, _
                               Optional bExact As Boolean = False) As SHDocVw.InternetExplorer

    Dim objShellWindows As New SHDocVw.ShellWindows
    Dim found As Boolean
    Dim startTime As Single

    found = False
    'Loop through shell windows
    For Each oGetIEWindowFromTitle In objShellWindows
        found = oGetIEWindowFromTitleHandler(oGetIEWindowFromTitle, sTitle, bCaseSensitive, bExact)
        If found Then Exit For
    Next

    'Check whether a window was found
    If Not found Then
        Set oGetIEWindowFromTitle = Nothing
    Else
        pauseUntilIEReady oGetIEWindowFromTitle
    End If

End Function

Private Function oGetIEWindowFromTitleHandler(win As SHDocVw.InternetExplorer, _
                                      sTitle As String, _
                                      bCaseSensitive As Boolean, _
                                      bExact As Boolean) As Boolean

    oGetIEWindowFromTitleHandler = False

    On Error GoTo handler
    'If the document is of type HTMLDocument, it is an IE window
    If TypeName(win.Document) = "HTMLDocument" Then
        'Check whether the title contains the passed title
        If bExact Then
            If (win.Document.title = sTitle) Or ((Not bCaseSensitive) And (LCase(sTitle) = LCase(win.Document.title))) Then oGetIEWindowFromTitleHandler = True
        Else
            If InStr(1, win.Document.title, sTitle) Or ((Not bCaseSensitive) And (InStr(1, LCase(win.Document.title), LCase(sTitle), vbTextCompare) <> 0)) Then oGetIEWindowFromTitleHandler = True
        End If
    End If
handler:
    'We assume here that if an error is raised it's because
    'the window is not of the correct type. Therefore we
    'simply ignore it and carry on.

End Function

使用上面的代码如下:

Sub test()

    Dim ie As SHDocVw.InternetExplorer
    Dim doc As HTMLDocument 'If you have a reference to the HTML Object Library
    'Dim doc as Object 'If you do not have a reference to the HTML Object Library

    ' Change the title here as required
    Set ie = oGetIEWindowFromTitle("My popup window")
    Set doc = ie.Document

    Debug.Print doc.getElementsByTagName("body").Item(0).innerText

End Sub

您几乎可以从窗口的任何属性或文档内容中找到一个窗口。如果您为此苦苦挣扎,请发表评论:)。

于 2013-01-22T23:58:09.550 回答