编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

解决 WPF WebBrowser 当前页面的脚本错误问题

wxchong 2025-01-29 18:27:49 开源技术 116 ℃ 0 评论

解决 WPF WebBrowser 当前页面的脚本错误问题

作 者:zhaotianff - 赵嘉

原文链接[1]:
https://www.cnblogs.com/zhaotianff/p/18471549

因为会有用户要求,需要将客户端体积最小化,不能使用新的浏览器控件,只能使用 WebBrowser

WebBrowserIE 内核的,现在很多 jsAPI 已经不能识别了。所以会报脚本错误,类似下面这样

解决方法的原理:

WebBrowser 内部是一个 InternetExplorer 实例,对应的是 IWebBrowser2 实例。

IWebBrowser2 提供了一个属性 Slient ,当这个属性值为 true 时,会禁用所有的弹窗。

实现步骤:

1、在界面放置一个 WebBrowser ,并增加 WebBrowserNavigated 事件处理程序

界面代码如下所示:
<Window x:Class="WebBrowserScriptError.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WebBrowserScriptError"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">

<Grid>
<WebBrowser Source="https://myfreetime.cn" Navigated="WebBrowser_Navigated"></WebBrowser>
</Grid>
</Window>

2、导入 COM 接口 IOleServiceProvider

[ComImport, Guid("6D5140C1-7436-11CE-8034-00AA006009FA"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IOleServiceProvider
{
[PreserveSig]
int QueryService([In] ref Guid guidService, [In] ref Guid riid, [MarshalAs(UnmanagedType.IDispatch)] out object ppvObject);
}

3、封装一个函数,用于设置启用/禁用浏览器弹框

public void SetSilent(WebBrowser browser, bool silent)
{
if (browser == )
throw new ArgumentException("browser");

//获取浏览器实例
IOleServiceProvider sp = browser.Document as IOleServiceProvider;
if (sp != )
{
Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E");

object webBrowser;
sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out webBrowser);
if (webBrowser != )
{
//设置Silent属性
webBrowser.GetType().InvokeMember("Silent", BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, , webBrowser, new object[] { silent });
}
}
}

4、在浏览器的Navigated事件处理程序中禁用弹框

 private void WebBrowser_Navigated(object sender, NavigationEventArgs e)
{
SetSilent(sender as WebBrowser, true);
}

示例代码[2]

https://learn.microsoft.com/en-us/dotnet/api/microsoft.uii.csr.browser.web.iwebbrowser2?view=dynamics-usd-3[3]

https://learn.microsoft.com/en-us/dotnet/api/microsoft.uii.csr.browser.web.iwebbrowser2.silent?view=dynamics-usd-3#microsoft-uii-csr-browser-web-iwebbrowser2-silent[4]

https://github.com/vbaderks/msf/blob/main/Undocumented%20Shell%20Interfaces.reg[5]

https://learn.microsoft.com/zh-cn/archive/msdn-technet-forums/8a62fed2-24c8-4765-a6ab-aa245fa7f8d5[6]

参考资料

[1]

原文链接: https://www.cnblogs.com/zhaotianff/p/18471549

[2]

示例代码: https://files-cdn.cnblogs.com/files/zhaotianff/WebBrowserScriptError.zip

[3]

https://learn.microsoft.com/en-us/dotnet/api/microsoft.uii.csr.browser.web.iwebbrowser2?view=dynamics-usd-3: https://learn.microsoft.com/en-us/dotnet/api/microsoft.uii.csr.browser.web.iwebbrowser2?view=dynamics-usd-3

[4]

https://learn.microsoft.com/en-us/dotnet/api/microsoft.uii.csr.browser.web.iwebbrowser2.silent?view=dynamics-usd-3#microsoft-uii-csr-browser-web-iwebbrowser2-silent: https://learn.microsoft.com/en-us/dotnet/api/microsoft.uii.csr.browser.web.iwebbrowser2.silent?view=dynamics-usd-3#microsoft-uii-csr-browser-web-iwebbrowser2-silent

[5]

https://github.com/vbaderks/msf/blob/main/Undocumented%20Shell%20Interfaces.reg: https://github.com/vbaderks/msf/blob/main/Undocumented%20Shell%20Interfaces.reg

[6]

https://learn.microsoft.com/zh-cn/archive/msdn-technet-forums/8a62fed2-24c8-4765-a6ab-aa245fa7f8d5: https://learn.microsoft.com/zh-cn/archive/msdn-technet-forums/8a62fed2-24c8-4765-a6ab-aa245fa7f8d5


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表