我正在尝试从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表达式可能会超出范围?)同时使用AddressOf
和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触发 - 请参阅here和here - 因为我没有在窗口的上下文中使用WebBrowser,所以我不认为在我的情况下,这甚至是可能的。)
答案 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
答案 1 :(得分:1)
您应该使用WPF附带的开箱即用标准WebBrowser Control(Winforms应用程序还有另一个)。它直接支持所有基本事件。
如果您错过了某些Winforms功能,例如IsWebBrowserContextMenuEnabled
或ScriptErrorsSuppressed
,建议您在此问题中参考我的回答: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