首页 > 其他分享 >解决WPF WebBrowser当前页面的脚本错误问题

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

时间:2024-10-17 10:33:26浏览次数:8  
标签:页面 Navigated WebBrowser webBrowser WPF Guid microsoft browser

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

而WebBrowser是IE内核的,现在很多js的API已经不能识别了。所以会报脚本错误,类似下面这样

 

解决方法的原理:

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

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

 

实现步骤:

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

 1 <Window x:Class="WebBrowserScriptError.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:local="clr-namespace:WebBrowserScriptError"
 7         mc:Ignorable="d"
 8         Title="MainWindow" Height="450" Width="800">
 9     <Grid>
10         <WebBrowser Source="https://myfreetime.cn" Navigated="WebBrowser_Navigated"></WebBrowser>
11     </Grid>
12 </Window>

 

 

2、导入COM接口IOleServiceProvider

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

 

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

 1 public void SetSilent(WebBrowser browser, bool silent)
 2 {
 3     if (browser == null)
 4         throw new ArgumentNullException("browser");
 5 
 6     //获取浏览器实例
 7     IOleServiceProvider sp = browser.Document as IOleServiceProvider;
 8     if (sp != null)
 9     {
10         Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
11         Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11d0-8A3E-00C04FC9E26E");
12 
13         object webBrowser;
14         sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out webBrowser);
15         if (webBrowser != null)
16         {
17             //设置Silent属性
18             webBrowser.GetType().InvokeMember("Silent", BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, null, webBrowser, new object[] { silent });
19         }
20     }
21 }

 

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

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

 

示例代码

 

参考资料:

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.silent?view=dynamics-usd-3#microsoft-uii-csr-browser-web-iwebbrowser2-silent

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

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

 

标签:页面,Navigated,WebBrowser,webBrowser,WPF,Guid,microsoft,browser
From: https://www.cnblogs.com/zhaotianff/p/18471549

相关文章

  • 界面控件Telerik UI for WPF 2024 Q3亮点 - 支持禁用数据过滤等
    TelerikUIforWPF拥有超过100个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。UIforWPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成VisualStudio工具箱中。本文将介绍界面组件TelerikUIforWPF在今......
  • QT实现滑动页面切换
    1.界面实现效果以下是具体的项目需要用到的效果展示。2.简介原理:使用Qt的QPropertyAnimation动画类,这里简单来说就是切换两个界面。这个widget里面可以放很多个待切换的界面,每次切换的时候将当前界面和切换后的界面显示,其他界面都隐藏,然后当前界面移动到主界面之外,下一......
  • 如何修改网站后台的图片?php网站显示页面修改密码?
    针对你的问题,我将其分为两部分来解答:一是如何修改网站后台的图片;二是如何在PHP网站上实现密码修改功能。1.如何修改网站后台的图片步骤一:访问网站后台登录到你网站的管理员界面或控制面板。步骤二:查找媒体管理区域在大多数内容管理系统(如WordPress)中,会有一个“媒体”、“文件......
  • c# .net8 winform 嵌入 wpf 控件
    .netframework例子很多,但.netcore的很难找,经过和gpt很长时间的沟通,完成了。关键点是vs2022似乎还不支持设计时的ElementHost,所以必须通过代码初始化。1.新建一个wpf控件库2.创建一个导圆角的TextBox,控件名为 UserControl13.winform项目添加对wpf控件库项目......
  • qt页面设计
    1.Designer设计师(掌握)Designer是Qt内置的一款界面设计程序,设计的界面文件为.ui格式。C++程序员通常不会单独启动Designer,如果要在项目中使用Designer程序,只需要在新建项目时,勾选“创建界面文件”选项。这样的项目自带dialog.ui,双击dialog.ui可以直接使用Designer程序......
  • 【Shiro】9.前端页面授权控制
     shiro可以与前端Thymeleaf结合,进行前端授权认证。由于,“吾生而有涯,而知而无涯”。所以,有限的生命不能照单全收无限的知识。而,前后端分离,必定是大趋势。所以,我就不额外写代码。截图记账理解一下。1.pom.xml页面引入Thymeleaf依赖。 2.配置类添加新配置 3.前端页面引入Sh......
  • 关于Gmap.Net在WPF中的运用笔记(二)地图标注及几种图形的绘制
    通过第一篇,我们已经成功的加载了高德地图:https://www.cnblogs.com/zhouxiao123/p/18469933现在,我们来往地图上加点东西。Gmap.Net中,提供了标注类GmapMarker,通过创建标注,在将其添加到地图上,可以实现在地图上标点的功能。准备一张地图标注图,推荐去阿里矢量图库选取,有不少免费的......
  • 修改当前路由地址参数重新刷新页面
    需求:不允许token暴漏在地址栏拿到token放到sessionStorage里面并重新刷新地址所有统一使用query的页面就直接替换为sessionStoragerouter.beforeEach((to,from,next)=>{//...其他代码...//检查是否有token参数if(to.query.token){//存储token到ses......
  • 关于Gmap.Net在WPF中的运用笔记(一)初步加载高德地图
    一、前言最近公司需要开发一个车辆在途轨迹追踪的软件,结合现有系统和技术体系,最终敲定使用WPF+Gmap.Net来实现,这里将一些坑踩一下,做个笔记记录一下。二、项目搭建本项目基于.Net6.0+Gmap.Net.Core+Gmap.Net.WinPresentation,前面是用到的框架版本,后面则是需要用到的地图包,可通......
  • 怎么将PDF文件页面转换成图片-免费工具分享
    怎么将PDF文件页面转换成图片序言目前市面上有关pdf处理的工具有很多,不过绝大多数的PDF处理工具都需要付费使用,且很多厂商甚至连试用的机会也不给用户,有试用的,也是限制在几页内,这样就导致用户还没有办法确认你的软件是否满足需要,就要先付费购买会员或者授权,这极大的影响了用......