前言
Webview2官方文档:
https://docs.microsoft.com/zh-cn/microsoft-edge/webview2/get-started/wpf
WPF加载网页的三种方式
- WebBrowser IE内核
- CEFSharp Chrome内核(三方库)
- Webview2 Chrome内核(官方库)
CEFSharp:
https://www.psvmc.cn/article/2021-10-29-wpf-cefsharp.html
Webview2 :
WebView2未来应该是要替代WebBrowser的,虽然需要依赖本机自带的Edge chromium内核,但相信未来的windows 更新肯定会以Edge chromium内核代替IE内核,并且不需要重新下载Chrome浏览器,使用Edge也会有一样的浏览体验。而作为桌面开发人员来说,使用WebView2直接加载网页会比使用CefSharp来得更舒服,不再需要引入一堆的CEF类库,同时安装文件也会缩小很多。
Flash支持测试页面
https://sc.chinaz.com/donghua/220315391630.htm
准备工作
FlashPlayer
https://www.flash.cn/download-wins
其实我们不同的浏览器使用到的DLL是不同的
Windows
Chrome
FireFox
所以我们可以根据自己的需求去安装,不用全部安装到PC上。
Flash的现状
IE安装插件还可以使用
360极速及QQ浏览器等,这些浏览器一般都是双内核,其中的Chromium内核版本一般都比较低,所以还可以继续加载Flash Player来使用,啥时候这些国产浏览器升级内核到88及以上版本,就彻底不支持了
获取系统IE版本
获取浏览器内核版本
https://www.psvmc.cn/zjtools/z/browserinfo/index.html
不要用下面这个地址,测试的不准确
网上有这么个说法
WebBrowser使用的浏览器版本是IE7,这个说法其实是不太准确的。
应该这样说
WebBrowser使用的是系统版本的IE对应的兼容模式。
比如Win10的是IE11,对应的兼容模式是IE7。
所以我在Win10上用下面两种方式获取到的IE版本都是11。
方式1
1 | /// <summary> |
方式2
1 | /// <summary> |
或者
1 | public static int GetCurrSystemIEVersion() |
注册表的生效规则
设置IE版本
当前用户配置
1 | # 32位 |
本机配置
1 | # 32位 |
设置IE GPU加速
当前用户配置
1 | # 32位 |
本机配置
1 | # 32位 |
32位和64位注册表的生效规则
系统 | 软件 | 生效的注册表 |
---|---|---|
32 位 | 32 位 | HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION |
64 位 | 64 位 | HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION |
64 位 | 32 位 | HKEY_CURRENT_USER\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION |
32 位 | 64 位 | 无法将 64 位版本的 Office 安装在 32 位版本的 Windows |
注意
HKEY_LOCAL_MACHINE
中设置的优先级要高于HKEY_CURRENT_USER
。- 建议配置
HKEY_CURRENT_USER
,HKEY_LOCAL_MACHINE
可能没有权限而报错。
注册表修改的两种方式
方式1
1 | string fileName = System.IO.Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); |
方式2
1 | string fileName = System.IO.Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); |
注意
推荐方式1
注册表设置IE版本
记录WebBrowser控件使用IE渲染版本的路径:
注意
注册表不要修改
HKEY_LOCAL_MACHINE
下的,因为可能没有权限而导致修改失败。
工具类1
1 | public class WebBrowserHelper |
工具类2
1 | public class IEHelper |
调用
1 | int version = GetMajorVersion(); |
注意
网上有这么个说法,把版本设置为非IE的版本号,会使用Edge,这个说法是错误的。
虽然更改后加载检测浏览器内核的网页上显示是Edge,但是其实上并不是使用的Edge。
WOW6432Node
其实不是64位程序的配置,而是64位系统
上32位程序
使用到的配置。
Registry.SetValue
方法会自动创建不存在的路径和值。
WebBrowser
WPF下的WebBrowser存在内存泄漏的问题,所以这里用WinForm
实现。
WebBrowser调用的就是本机IE浏览器,并且WebBrowser默认就是运行在
IE7 mode
下。
添加Falsh插件
有些老的系统必须用IE执行的,就只能用WebBrowser了。
保证IE上能运行Flash只需要安装flashplayerax_install_cn.exe
就可以了。
首先我们要判断Flash有没有安装
1 | private bool checkFlashInstall() |
安装EXE程序
1 | private void installEXE(string fileName, string arguments) |
注意
安装成功或退出,
result
返回的字符串都是空字符串。
判断并安装
1 | private void Form1_Load(object sender, EventArgs e) |
窗口弹出
当页面中打开新页面的方式是window.open
的时候,默认的行为是调用系统的IE打开,这样就会出现一个问题,打开的IE页面是读取不到我们页面的cookie数据的,导致登录失效。
所以解决的方法是
- 获取弹出页面的网址
- 本窗口打开或者新窗口打开
那么怎么获取到弹出页面的网址呢?
默认的WebBrowser新打开的窗口会用系统默认的IE打开,并且我们也没法获取新窗口的地址自行处理。
所以我们自定义WebBrowser保证能获取新窗口的地址。
自定义ExtendedWebBrowser
1 | using System; |
回到Form1.cs[设计]
窗口,在菜单生成
中,点生成解决方案
。
一会之后在工具箱的最上方就会出现一个新的组件ExtendedWebBrowser
,把ExtendedWebBrowser
拖进来。
在ExtendedWebBrowser
的事件里双击BeforeNewWindow
并添加代码:
本窗口打开
1 | private void extendedWebBrowser1_BeforeNewWindow(object sender, EventArgs e) |
或者
新窗口打开
1 | private void extendedWebBrowser1_BeforeNewWindow(object sender, EventArgs e) |
WinForm显示模糊的解决办法
WinForm 对高分辨率屏幕的适配并不是很好,当分辨率较高时,Windows 系统会将程序里面的字体进行缩放,在 Windows 10 系统尤其严重,这将导致程序的界面大小变化,字体也会变得模糊。
以下两种方法任选其一即可。
方法1
我们用WebBrowser加载的网页,会看起来有点模糊,设置DPI设置的问题,解决方法如下:
Form的属性设置如下
将 Form 的 AutoScaleMode
属性设置为 DPI
;
在 Program.cs 中添加以下代码:
1 | internal static class Program |
方法2
知道了导致程序模糊的原因,找到相应的解决方法就很简单了,我们只需要让程序感知 DPI ,当 DPI 较高时禁止 Windows 对其进行自动缩放。
注意事项:该方法适用于 .NET Framework 版本大于等于4.5的程序。
右键项目,添加应用程序清单文件
。
把其中的下面的代码部分解除注释:
1 | <application xmlns="urn:schemas-microsoft-com:asm.v3"> |
在程序配置文件(app.config)的appSettings
节点下添加如下代码
1 | <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" /> |
结果大致如下
1 |
|
CEF加载Flash
找到本地flash的dll(pepflashplayer.dll)
项目中新建plugins,添加pepflashplayer.dll,右击属性,改为始终复制
CEF初始化配置
1 | CefSettings settings = new CefSharp.CefSettings() |