Internet Explorer实例DocumentComplete未触发

时间:2014-07-13 18:30:44

标签: wpf vb.net ie-automation

我正在尝试从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

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

NavigateComplete2事件存在相同的行为。

我尝试使用类成员方法而不是lambda表达式(一旦方法退出,lambda表达式可能会超出范围?)同时使用AddressOfHandles,但是没有帮助

要让DocumentComplete事件触发,我该怎么做?

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

更新

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

正如SimonMourier在评论中指出的那样,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,所以我不认为在我的情况下,这甚至是可能的。)

3 个答案:

答案 0 :(得分:1)

您可以使用WPF提供的ShDocVw.InternetExplorer控件,而不是使用WebBrowser

<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

enter image description here

答案 1 :(得分:1)

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

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

您只需要在这些特殊情况下进行互操作,或者如果您需要获取本机底层IE的文档对象模型(DOM),IHTMLDocument2等接口

答案 2 :(得分:1)

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

我也遇到过这个问题,并且由于访问权限而发生。 使用管理员权限运行您的应用程序,这样会很好。

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

UPDATE1:

如果您可以设法让管理员权限启动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