已解决
wpf webBrowser控件 常用的函数和内存泄漏问题
来自网友在路上 131831提问 提问时间:2023-10-09 17:01:59阅读次数: 31
最佳答案 问答题库318位专家为你答疑解惑
介绍
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 documentIOleServiceProvider 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 11break;}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;}
查看全文
99%的人还看了
相似问题
- conda创建pytorch环境报错
- Python通过selenium调用IE11浏览器报错解决方法
- kafka本地安装报错
- 【BUG】第一次创建vue3+vite项目启动报错Error: Cannot find module ‘worker_threads‘
- git 构建报错
- Docker build报错总结,版本过新大避雷!
- Mongodb3.4升级高版本mongoTemplate.executeCommand报错The cursor option is required
- duplicate复制数据库单个数据文件复制失败报错rman-03009 ora-03113
- 安装第三方包报错 error: Microsoft Visual C++ 14.0 or greater is required——解决办法
- 邮件|gitpushgithub报错|Lombok注解
猜你感兴趣
版权申明
本文"wpf webBrowser控件 常用的函数和内存泄漏问题":http://eshow365.cn/6-17895-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 大数据List去重
- 下一篇: uniapp apple 苹果登录 离线本地打包