【问题标题】:Internet Explorer instance DocumentComplete not firingInternet Explorer 实例 DocumentComplete 未触发
【发布时间】:2014-07-13 18:30:43
【问题描述】:

我正在尝试从 WPF 应用程序创建 Internet Explorer 实例,加载保存的本地文件,并在加载文件后进行进一步处理。但是,尽管该文件在 Internet Explorer 窗口中可见,但 DocumentComplete 事件永远不会触发:

'static field
Dim iex As ShDocVw.InternetExplorer

Public Sub DoStuff()
    Dim path = "c:\test.htm"
    iex = New SHDocVw.InternetExplorer
    iex.Visible = True
    AddHandler iex.DocumentComplete, Sub(o As Object, ByRef url As Object)
            'This code is never executed
            Dim i = 5
        End Sub
    iex.Navigate2(path)
End Sub

当我导航到非本地 URL(例如 http://www.google.com)时,DocumentComplete 事件会触发。

NavigateComplete2 事件存在相同的行为。

我尝试使用 AddressOfHandles 使用类成员方法而不是 lambda 表达式(也许 lambda 表达式在方法退出后超出范围?),但这没有帮助。

我必须做什么才能触发DocumentComplete 事件?

(注意:页面没有框架。)

更新

此代码正在类库中使用,因此我无法使用 WebBrowser 控件,因为它无法在代码中实例化。

正如 SimonMourier 在 cmets 中指出的那样,可以在代码中实例化 WebBrowser:

Dim wb = New WebBrowser
AddHandler wb.LoadCompleted, Sub(s, e)
    Dim i = 5
End Sub
wb.Navigate(path)

虽然 LoadCompleted 事件仍然没有触发,但 Navigated 事件会触发,而且它似乎足以满足我的目的。 (显然,WebBrowser 必须是可见的才能 LoadCompleted 触发 - 请参阅herehere - 因为我没有在窗口的上下文中使用 WebBrowser,我认为这甚至是不可能的就我而言。)

【问题讨论】:

  • 为什么不用WebBrowser控件?
  • @SimonMourier 我不需要在 WPF 窗口的上下文中定义/实例化 WebBrowser 吗?另外,根据您的经验,WebBrowser 不会有这个问题吗?
  • 嗯,WebBrowser 正是为这种情况而设计的,是的,它支持(大多数)IE 事件。只有在需要访问本机接口(如 IHtmlDocument2 等)时才需要互操作。我建议你还是试试吧。
  • @SimonMourier 这是类库中的代码,我认为我没有办法从类库中实例化 WebBrowser。
  • WebBrowser 是一个可以在任何地方创建的类

标签: wpf vb.net ie-automation


【解决方案1】:

您应该使用随 WPF 一起提供的开箱即用标准 WebBrowser Control(Winforms 应用程序还有另一个标准)。它直接支持所有基本事件。

如果您错过了一些 Winforms 功能,例如 IsWebBrowserContextMenuEnabledScriptErrorsSuppressed,我建议您参考我在这个问题上的回答:How to deactivate "right click" on WPF Webbrowser Control?

您只需要在这些特殊情况下进行互操作,或者如果您需要掌握原生底层 IE 的文档对象模型 (DOM)、IHTMLDocument2 等接口等。

【讨论】:

    【解决方案2】:

    您可以使用 WPF 提供的WebBrowser 控件来代替ShDocVw.InternetExplorer

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
        <Grid>
            <WebBrowser x:Name="webBrowser" Visibility="Visible" />
        </Grid>
    </Window>
    
    
    
    Class MainWindow
        Public Sub DoStuff()
            Dim path = New Uri("c:\test.htm")
            AddHandler webBrowser.LoadCompleted, Sub(sender As Object, e As System.Windows.Navigation.NavigationEventArgs)
                                                     Dim i = 5
                                                 End Sub
            webBrowser.Navigate(path)
        End Sub
    
        Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
            DoStuff()
        End Sub
    End Class
    

    【讨论】:

    • 当我尝试使用您的代码时,它运行良好。 DocumentCompleted 在我打开本地 .htm 文件时被调用。检查您是否对该文件具有所需的权限。检查thisthis 链接,如果这些对您有帮助。
    • 如果我在 Internet Explorer 窗口中看到该页面,可能会缺少哪些权限?
    【解决方案3】:

    无需使用 WebBrowser Control 即可解决此问题。

    我也遇到过这个问题,这是由于访问权限造成的。 以管理员权限运行您的应用程序,一切都会好的。

    要调试尝试以管理员身份运行 Visual Studio,然后进行测试,将触发 DocumentComplete 事件。

    更新1:

    对于非管理员应用程序,如果您可以设法以管理员权限启动 Internet Explorer,那么您也可以使用非管理员应用程序使用它。 使用管理员权限轻松启动 Internet Explorer 进程。

    然后你就可以用这段代码钩住它了

       For Each IE As InternetExplorer In New SHDocVw.ShellWindows
            If IE.FullName.ToLower.Contains("iexplore") And IE.LocationURL <> "" Then
                'Capture IE here
            End If
        Next
    

    【讨论】:

    • +1。不幸的是,该应用程序也在非管理员帐户下运行。
    猜你喜欢
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多