2

我正在尝试从 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事件存在相同的行为。

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

我必须做什么才能让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 触发 - 请参见此处此处- 由于我没有在窗口的上下文中使用 WebBrowser,因此我认为这在我的情况下甚至是不可能的。 )

4

3 回答 3

1

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

<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

在此处输入图像描述

于 2014-07-16T11:02:17.947 回答
1

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

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

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

于 2014-07-17T17:26:45.980 回答
1

无需使用 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
于 2014-07-30T08:24:14.547 回答