wpf webBrowser控件 常用的函数和内存泄漏问题

news2024/12/28 21:06:48

介绍

WebBrowsers可以让我们在窗体中进行导航网页。
WebBrowser控件内部使用ie的引擎,因此使用WebBrowser我们必须安装ie浏览器(windows默认安装的)。

使用

直接在xmal中使用webBrowser控件

<WebBrowser x:Name="WebBrowser1" Source ="xxx.com"></WebBrowser>

其中Source熟悉可以将webBrowser控件指向一个网页(也可以是本地文件的绝对路径)
除了使用Source属性还有以下方法进行导航:
在这里插入图片描述

问题

  • js报错
    默认情况下webBrowser用的是比较低的ie内核,这样如果访问的网页有不支持的脚本或者其他问题,就会没有办法正常运行,比如报错 javaScript错误。某些情况下使用ie可以打开的网页,在webBrowser需要管理员权限才可以正常打开,没有管理员权限也会报jabaScript错误。所以一般使用winForm的webBrowser,方便扩展,并且资料多。
    • 避免报错不弹提示框。
	WebBrowser1.Navigated += (sender, args) =>
	{
     	SetSilent(wbMain, true)
	}   
public static void SetSilent(WebBrowser browser, bool silent)
{
    if (browser == null)
     throw new ArgumentNullException("browser");

    // get an IWebBrowser2 from the document
    IOleServiceProvider sp = browser.Document as IOleServiceProvider;
    if (sp != null)
    {
        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 != null)
        {
         webBrowser.GetType().InvokeMember("Silent", BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, null, webBrowser, new object[] { silent });
        }
    }
}
[ComImport, Guid("6D5140C1-7436-11CE-8034-00AA006009FA"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
private interface IOleServiceProvider
{
    [PreserveSig]
    int QueryService([In] ref Guid guidService, [In] ref Guid riid, [MarshalAs(UnmanagedType.IDispatch)] out object ppvObject);
}

这种只是让它不出现报错窗口,不能从根本上解决。

  • 修改注册表使用新的ie内核,下面是代码:
 static void SetWebBrowserFeatures(int ieVersion)
    {
        if (LicenseManager.UsageMode != LicenseUsageMode.Runtime)
            return;
        var appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
        UInt32 ieMode = GeoEmulationModee(ieVersion);
        var featureControlRegKey = @"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\";
        Registry.SetValue(featureControlRegKey + "FEATURE_BROWSER_EMULATION",
            appName, ieMode, RegistryValueKind.DWord);
        Registry.SetValue(featureControlRegKey + "FEATURE_ENABLE_CLIPCHILDREN_OPTIMIZATION",
            appName, 1, RegistryValueKind.DWord);
    }

    static UInt32 GeoEmulationModee(int browserVersion)
    {
        UInt32 mode = 11000; // Internet Explorer 11. Webpages containing standards-based !DOCTYPE directives are displayed in IE11 Standards mode. 
        switch (browserVersion)
        {
            case 7:
                mode = 7000; // Webpages containing standards-based !DOCTYPE directives are displayed in IE7 Standards mode. 
                break;
            case 8:
                mode = 8000; // Webpages containing standards-based !DOCTYPE directives are displayed in IE8 mode. 
                break;
            case 9:
                mode = 9000; // Internet Explorer 9. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode.                    
                break;
            case 10:
                mode = 10000; // Internet Explorer 10.
                break;
            case 11:
                mode = 11000; // Internet Explorer 11
                break;
        }
        return mode;
    }

比如你想使用最新的IE11

 SetWebBrowserFeatures(11);

在网页中强制以ie最高级别的可用模式显示内容

<meta http-equiv="X-UA-Compatible" content="edge" />

内存泄漏的解决方式

Memory leak when using WPF WebBrowser control in multiple windows

  • 将WebBrowser放到子进程中,每次开关都会重新分配内存
  • 删除掉所有引用,来清理内存泄漏。关闭窗口时调用下面代码。
    public void Dispose()
    {
        webBrowser.Dispose();

        var window = GetWindowElement(webBrowser);

        if (window == null)
            return;

        var field = typeof(Window).GetField("_swh", BindingFlags.NonPublic | BindingFlags.Instance);

        var valueSwh = field.GetValue(window);
        var valueSourceWindow = valueSwh.GetType().GetField("_sourceWindow", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(valueSwh);
        var valuekeyboardInput = valueSourceWindow.GetType().GetField("_keyboardInputSinkChildren", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(valueSourceWindow);

        var inputSites = valuekeyboardInput as IEnumerable<IKeyboardInputSite>;

        if (inputSites == null)
            return;

        var currentSite = inputSites.FirstOrDefault(s => ReferenceEquals(s.Sink, webBrowser));

        if (currentSite != null)
            currentSite.Unregister();
    }

    private static Window GetWindowElement(DependencyObject element)
    {
        while (element != null && !(element is Window))
        {
            element = VisualTreeHelper.GetParent(element);
        }

        return element as Window;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1068565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot使用ProcessBuilder创建系统进程执行shell命令备份数据库

文章目录 概要1、查看mysql版本2、相关依赖3、具体代码技术细节 概要 Springboot执行shell命令备份数据库。 1、查看mysql版本 mysql --version2、相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…

单位脉冲信号转换直流信号变换器 隔离的频率(脉冲)变送器

主要特性 将单位脉冲信号转换成直流电压或电流信号。 精度等级&#xff1a;0.1 级、0.2 级、0.5 级。产品出厂前已检验校正&#xff0c;用户可以直接使用。 国际标准信号输入: 0-5KHz/0-10KHz/1-5KHz等 0-5V/0-10V/1-5V 等电压信号,0-10mA/0-20mA/4-20mA 等电流信号。 …

下载安装包,platform的含义

安装包platform的含义 每次安装某个软件时&#xff0c;会让你选择platform&#xff0c;遇到 满脸问号❓❓❓❓❓❓❓❓❓❓❓❓ windowLinux x86_64Linux aarch64macOS aarch64macOS aarch64macOS aarch64deb aarch64 其中window大家都很熟悉&#xff0c;wndows系统 安装 选…

java基础之组合和继承

为了避免重复代码太多&#xff0c;导致代码不好维护&#xff0c;大家需要学会如何复用代码&#xff0c;代码复用的两种方式&#xff0c;组合和继承 组合&#xff1a;在新类中创建现有类的对象 has-a 继承&#xff1a;创建现有类的新类 is-a 依赖&#xff1a;uses-a UML关系 继承…

Tailwind CSS浅析与实操

Tailwind CSS 一、Tailwind CSS简介 What is Tailwind CSS Tailwind CSS| TailwindCSS中文文档 | TailwindCSS中文网官方解释&#xff1a;只需书写 HTML 代码&#xff0c;无需书写 CSS&#xff0c;即可快速构建美观的网站。本质上是一个工具集&#xff0c;包含了大量类似 fle…

nginx动态分离(四)

概述 动静分离把静态文件放入nginx或者说服务器的某个文件夹&#xff0c;这里把文件放入服务器的根目录下/data ,创建一个test目录&#xff0c;这样就直接访问到test目录下的静态文件 [121.4.170.108/test/b.html] demo #user nobody; worker_processes 1;#error_log log…

没有苹果本也可以构建ios版本+生成不同设备效果图——香蕉云编

三年前&#xff0c;我曾经写过uniapp的程序&#xff0c;时隔三年&#xff0c;又遇到了uniapp的需求&#xff0c;之前没有自行申请ios证书&#xff0c;现在终于要自己生成证书了。。。 是福不是祸&#xff0c;是祸躲不过。 uniapp生成ios证书的详细步骤 uniapp对接unipush的操作…

一文搞懂Transformer的边角料知识:位置编码

目录 一、为什么需要位置编码 二、位置编码分类 1.表格型 2.函数型 三、Transformer的位置编码 1.位置编码应有的特点 2.Transformer的位置编码公式 3.三角函数 4.线性相关 5.相对位置关系 四、总结 一、为什么需要位置编码 在Transformer出现以前&#xff0c;NLP任…

白话教你认识 Kafka,秒懂原理

一、Kafka 基础 消息系统的作用 应该大部份小伙伴都清楚&#xff0c;用机油装箱举个例子 所以消息系统就是如上图我们所说的仓库&#xff0c;能在中间过程作为缓存&#xff0c;并且实现解耦合的作用。 引入一个场景&#xff0c;我们知道中国移动&#xff0c;中国联通&#x…

谷歌浏览器从c盘剪切到d盘书签消失的找回方式

目录 1.在以下路径找到这两个文件(Bookmarks和Bookmarks.bak) 2.我们只需要将上述的两个文件Bookmarks和Bookmarks.bak先备份到一个地方&#xff0c;替换文件&#xff1a; 3.重启谷歌浏览器 1.在以下路径找到这两个文件(Bookmarks和Bookmarks.bak) 移动后的新路径\Google\C…

vue自行封装错误提示信息——$message——技能提升

在使用vue的过程中&#xff0c;我们经常用到的是这一种的提示信息&#xff1a; 该组件提供的属性有以下几个&#xff1a; 但是&#xff0c;如果想要自定义提示信息&#xff0c;则可以使用下面的方式来处理&#xff1a; 1.自定义提示信息组件 import Vue from vue export fu…

Linux基本指令二

Linux基本指令二 一、more指令1、语法2、功能3、常用操作 二、less指令1、语法2、功能3、常用选项4、常用操作 三、head指令1、语法2、功能3、常用选项4、示例 四、tail指令1、语法2、功能3、常用选项4、示例 五、date指令1、语法2、功能3、常用的标记4、设置时间5、时间戳6、示…

VxeTable 表格组件推荐

VxeTable 表格组件推荐 https://vxetable.cn 在前端开发中&#xff0c;表格组件是不可或缺的一部分&#xff0c;它们用于展示和管理数据&#xff0c;为用户提供了重要的数据交互功能。VxeTable 是一个优秀的 Vue 表格组件&#xff0c;它提供了丰富的功能和灵活的配置选项&…

linux上negix部署静态页面

1.看配置文件 进入cndf.d 这里的是配置部署项目中的文件 进入一个查看下 上面的是服务的域名&#xff0c;服务是http://test.fun-med.cn/#/&#xff0c;后面加服务名&#xff08;你的前端&#xff09; 2.看下页面位置 和上面的路径要匹配

IDEA工具的 CTRL + Shift + F 全局搜索失效

失效原因&#xff1a;快捷键冲突&#xff0c;与输入法默认的简繁体切换快捷键冲突了。 解决方式&#xff1a; 1、微软输入法 1.1 、任务栏 – 微软任务 – 语言首选项 1.2、微软拼音 – 选项 1.3、按键 – 热键&#xff08;简体/繁体中文输入切换&#xff09;关闭或修改 …

华为云CodeArts Check代码检查插件(VSCode IDE版本)使用指南

CodeArts Check VSCode IDE代码检查插件 本插件致力于守护开发人员代码质量&#xff0c;成为开发人员的助手和利器。秉承极简、极速、即时看护的理念&#xff0c;提供业界规范&#xff08;含华为云&#xff09;的检查、代码风格一键格式化及代码自动修复功能。 感兴趣的小伙伴…

并网型虚拟同步发电机控制仿真(Matlabsimulink仿真实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Python_PyQtGraph 学习笔记(八)】基于PyQtGraph将X轴坐标设置为系统时间

【Python_PyQtGraph 学习笔记(八)】基于PyQtGraph将X轴坐标设置为系统时间 前言正文1、获取plotItem的bottom轴对象2、设置刻度值,即获取时间3、刻度值与显示数值绑定4、设置bottom轴的刻度数值显示前言 基于PySide2、PyQtGraph和PySide2动态绘图,将X轴坐标设置为系统事件…

Linux 实践项目之论坛搭建

目录 一、思路 1、环境搭建&#xff08;lamp--Linux apache mysql php &#xff09; 2、关闭防火墙SELinux启动服务 3、将论坛源代码上传至/var/www/html路径下 4、设置MySQL数据库名称和密码 5、浏览器上搭建Discuz论坛 二、实操 1、安装 2、关闭防火墙SELinux启动服务…

Activiti工作流引擎详解与应用

一、简介 Activiti是一个开源的工作流引擎&#xff0c;基于BPMN2.0标准进行流程定义。它可以将业务系统中复杂的业务流程抽取出来&#xff0c;使用专门的建模语言BPMN2.0进行定义&#xff0c;业务流程按照预先定义的流程进行执行&#xff0c;实现了系统的流程由Activiti进行管…