使用场景

使用WebBrowser只是为了做内嵌页展示,内嵌页内容链接要跳转系统默认浏览器。

遇到问题

1.非ui主线程打开的WebBrowser加载的网页内容链接无法跳转
2.非链接标签无法跳转,如下button标签

<button class="container" onclick="clickTwo()">
function clickOne() {// 按钮1链接var link1 = 'https://xxx'clickEvent(link1, '按钮1')
}

解决办法

WebBrowser控件的内核为IE,默认为IE7,很多的网站不支持IE7,所以需要使用WebBrowser的话,对WebBrowser提升内核还是很有必要的。
下面通过修改注册表信息来兼容当前程序的方式可以解决第二个问题。

static class WebBrowserEx
{#region 浏览器设置/// <summary>  /// 修改注册表信息来兼容当前程序  /// </summary>  private static void SetWebBrowserFeatures(int ieVersion){if (LicenseManager.UsageMode != LicenseUsageMode.Runtime)return;//获取程序及名称  var appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);//得到浏览器的模式的值  uint ieMode = GetEmulationMode(ieVersion);var featureControlRegKey = @"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\";//设置浏览器对应用程序(appName)以什么模式(ieMode)运行  Registry.SetValue(featureControlRegKey + "FEATURE_BROWSER_EMULATION",appName, ieMode, RegistryValueKind.DWord);//不晓得设置有什么用  Registry.SetValue(featureControlRegKey + "FEATURE_ENABLE_CLIPCHILDREN_OPTIMIZATION",appName, 1, RegistryValueKind.DWord);}/// <summary>  /// 获取浏览器的版本  /// </summary>  /// <returns></returns>  public static int GetBrowserVersion(){int browserVersion = 0;using (var ieKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer",RegistryKeyPermissionCheck.ReadSubTree,System.Security.AccessControl.RegistryRights.QueryValues)){var version = ieKey.GetValue("svcVersion");if (null == version){version = ieKey.GetValue("Version");if (null == version)throw new ApplicationException("Microsoft Internet Explorer is required!");}int.TryParse(version.ToString().Split('.')[0], out browserVersion);}//如果小于7  if (browserVersion < 7){throw new ApplicationException("不支持的浏览器版本!");}return browserVersion;}/// <summary>  /// 通过版本得到浏览器模式的值  /// </summary>  /// <param name="browserVersion"></param>  /// <returns></returns>  public static uint GetEmulationMode(int browserVersion){UInt32 mode = 11000; // Internet Explorer 11switch (browserVersion){case 7:mode = 7000; // Internet Explorer 7break;case 8:mode = 8000; // Internet Explorer 8break;case 9:mode = 9000; // Internet Explorer 9break;case 10:mode = 10000; // Internet Explorer 10.  break;case 11:mode = 11000; // Internet Explorer 11  break;}return mode;}/// <summary>/// 查询系统环境是否支持IE8以上版本/// </summary>public static bool IfWindowsSupport(){bool isWin7 = Environment.OSVersion.Version.Major > 6;bool isSever2008R2 = Environment.OSVersion.Version.Major == 6&& Environment.OSVersion.Version.Minor >= 1;if (!isWin7 && !isSever2008R2){return false;}else return true;}public static void SetIEVersion(){int ieVersion = GetBrowserVersion();if (IfWindowsSupport()){SetWebBrowserFeatures(ieVersion < 11 ? ieVersion : 11);}else{// 如果不支持IE8 则修改为当前系统的IE版本SetWebBrowserFeatures(ieVersion < 7 ? 7 : ieVersion);}}#endregion
}

WebBrowser内嵌页内容链接默认使用IE浏览器打开,如果要跳转系统默认浏览器,需要能够获取跳转的链接才能指定默认浏览器打开。需要重新封装WebBrowser来获取跳转Url。

public class WebBrowserExtendedNavigatingEventArgs : CancelEventArgs
{private string _Url;public string Url{get { return _Url; }}private string _Frame;public string Frame{get { return _Frame; }}public WebBrowserExtendedNavigatingEventArgs(string url, string frame): base(){_Url = url;_Frame = frame;}
}public class ExtendedWebBrowser : System.Windows.Forms.WebBrowser
{System.Windows.Forms.AxHost.ConnectionPointCookie cookie;WebBrowserExtendedEvents events;//This method will be called to give you a chance to create your own event sinkprotected override void CreateSink(){//MAKE SURE TO CALL THE BASE or the normal events won't firebase.CreateSink();events = new WebBrowserExtendedEvents(this);cookie = new System.Windows.Forms.AxHost.ConnectionPointCookie(this.ActiveXInstance, events, typeof(DWebBrowserEvents2));}protected override void DetachSink(){if (null != cookie){cookie.Disconnect();cookie = null;}base.DetachSink();}//This new event will fire when the page is navigatingpublic event EventHandler BeforeNavigate;public event EventHandler BeforeNewWindow;protected void OnBeforeNewWindow(string url, out bool cancel){EventHandler h = BeforeNewWindow;WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, null);if (null != h){h(this, args);}cancel = args.Cancel;}protected void OnBeforeNavigate(string url, string frame, out bool cancel){EventHandler h = BeforeNavigate;WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, frame);if (null != h){h(this, args);}//Pass the cancellation chosen back out to the eventscancel = args.Cancel;}//This class will capture events from the WebBrowserclass WebBrowserExtendedEvents : System.Runtime.InteropServices.StandardOleMarshalObject, DWebBrowserEvents2{ExtendedWebBrowser _Browser;public WebBrowserExtendedEvents(ExtendedWebBrowser browser) { _Browser = browser; }//Implement whichever events you wishpublic void BeforeNavigate2(object pDisp, ref object URL, ref object flags, ref object targetFrameName, ref object postData, ref object headers, ref bool cancel){_Browser.OnBeforeNavigate((string)URL, (string)targetFrameName, out cancel);}public void NewWindow3(object pDisp, ref bool cancel, ref object flags, ref object URLContext, ref object URL){_Browser.OnBeforeNewWindow((string)URL, out cancel);}}[System.Runtime.InteropServices.ComImport(), System.Runtime.InteropServices.Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"),System.Runtime.InteropServices.InterfaceTypeAttribute(System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIDispatch),System.Runtime.InteropServices.TypeLibType(System.Runtime.InteropServices.TypeLibTypeFlags.FHidden)]public interface DWebBrowserEvents2{[System.Runtime.InteropServices.DispId(250)]void BeforeNavigate2([System.Runtime.InteropServices.In,System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.IDispatch)] object pDisp,[System.Runtime.InteropServices.In] ref object URL,[System.Runtime.InteropServices.In] ref object flags,[System.Runtime.InteropServices.In] ref object targetFrameName, [System.Runtime.InteropServices.In] ref object postData,[System.Runtime.InteropServices.In] ref object headers,[System.Runtime.InteropServices.In,System.Runtime.InteropServices.Out] ref bool cancel);[System.Runtime.InteropServices.DispId(273)]void NewWindow3([System.Runtime.InteropServices.In,System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.IDispatch)] object pDisp,[System.Runtime.InteropServices.In, System.Runtime.InteropServices.Out] ref bool cancel,[System.Runtime.InteropServices.In] ref object flags,[System.Runtime.InteropServices.In] ref object URLContext,[System.Runtime.InteropServices.In] ref object URL);}
}
ExtendedWebBrowser web;
private void Form1_Load(object sender, EventArgs e)
{WebBrowserEx.SetIEVersion();web = new ExtendedWebBrowser();web.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(Wb_DocumentCompleted);web.NewWindow += new CancelEventHandler(webBrowser_NewWindow);web.BeforeNewWindow += new EventHandler(webBrowser_BeforeNewWindow);web.ScriptErrorsSuppressed = true;web.Url = new Uri(uri); web.Dock = DockStyle.Fill;this.Controls.Add(web);
}private void Wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{}private void webBrowser_NewWindow(object sender, CancelEventArgs e)
{e.Cancel = true;
}private void webBrowser_BeforeNewWindow(object sender, EventArgs e)
{WebBrowserExtendedNavigatingEventArgs eventArgs = e as WebBrowserExtendedNavigatingEventArgs;System.Diagnostics.Process.Start(eventArgs.Url);
}

通过获取到的url跳转到默认浏览器,上面的两个问题得到解决。

参考

https://www.cnblogs.com/sung/p/3391264.html
https://blog.csdn.net/sinat_32232885/article/details/52182180
https://blog.csdn.net/sunjilonggood/article/details/103885575

C# WebBrowser无法跳转默认浏览器问题相关推荐

  1. 解密-大象跳转如何实现微信中点击链接直接跳到默认浏览器(不是在微信内置浏览器打开)

    很多朋友不知道如何实现微信中点击链接直接跳到默认浏览器的功能是如何实现,经常能在各大论坛看到这样的提问,故特写了这篇文章分享一下之前在网上看到的一个在线使用该功能的平台的操作方法. 大象跳转在线操作步 ...

  2. JavaScript - 唤醒 app store 跳转到苹果商店内下载指定应用页面 安卓跳转默认浏览器应用页面

    本篇文章主要记录通过微信分享页判断设备类型并跳转对应的下载页: 安卓跳转默认浏览器 苹果跳转苹果商店App Store 通过 window.navigator 获取智能机信息.浏览器版本信息 获取智能 ...

  3. 微信扫描二维码自动跳转到app下载页面(安卓跳转默认浏览器 苹果跳转苹果商店App Store)

    来源分析 商业分析在微信的使用人数已经高居各通讯APP的榜首的同时,微信成为了我国移动流量最大的平台之一.在次趋势的引导下,很多的商家.体户便抓住了这一机遇,利用微信这个渠道来做产品的推广.以及营销方 ...

  4. 微信中点击链接直接跳到默认浏览器是怎么实现的?(不是在微信内置浏览器打开)

    微信扫描二维码安装apk时,如何避免点击右上角? --这个问题困扰很多App的推广团队. 其实自从腾讯开放平台战略以来,拥有中国强大互联网资源的腾讯站在更高的战略高度上,以自信的态度面对互联网生态链, ...

  5. 微信中如何做到访问app的下载链接直接跳到默认浏览器去执行下载

    很多朋友都已经习惯在微信内分享网页链接和二维码了,通过扫描二维码下载APP或打开网页也成为大家惯用且非常方便的方式了.如此微信就成为了扫描二维码重要的工具,因为对于用户来说,说到二维码大家第一反应就是 ...

  6. 微信自动跳转到app下载页面(安卓跳转默认浏览器 苹果跳转苹果商店App Store)

    来源分析 商业分析在微信的使用人数已经高居各通讯APP的榜首的同时,微信成为了我国移动流量最大的平台之一.在次趋势的引导下,很多的商家.体户便抓住了这一机遇,利用微信这个渠道来做产品的推广.以及营销方 ...

  7. 微信自动下载app(安卓跳转默认浏览器 苹果跳转苹果商店App Store)

    很多朋友的APP推广链接需要在微信中进行的网页宣传.传播.下载等等,但是各位朋友一定发现了微信中是屏蔽掉了APP的下载链接的.但是微信最为一个最大的社交平台,为了自身的利益,屏蔽掉了所有APK的下载链 ...

  8. 微信自动下载app(安卓跳转默认浏览器 苹果跳转苹果商店App Store)的实现教程尽在Mindjump

    最近在很多论坛和博客上都能看到有朋友咨询微信跳转手机默认浏览器下载app要怎么实现,其实只要用api接口对链接进行相关的处理即可实现这个功能了.为了解答大家的疑惑,特写这篇文章分享一个我们团队之前用的 ...

  9. 微信网址遮罩引导法升级版,微信自动跳转默认浏览器打开HTML

    微信打开网址添加在浏览器中打开提示 和 微信扫描打开APP下载链接提示代码优化,尽管已经做得很简单,但发现很多问这类问题的都是小白. 其实原来很简单,就是判断当前是在微信内置浏览器中,然后将默认隐藏的 ...

最新文章

  1. 企业 SpringBoot 教程 (七)springboot开启声明式事务
  2. servlet httpClient 下载远程文件
  3. jboss中控制台jmx-console 登录的用户名和密码设置
  4. PHP-7.1 源代码学习:虚拟机字节码
  5. 10个美丽的例子,插图在网页设计中的应用
  6. NYOJ 155 求高精度幂
  7. storm后台启动命令(避免新开窗口)
  8. matlab 图像的色彩强度,图像色彩增强的问题,,,小白给跪,
  9. Qt中如何获得文件和文件夹的路径信息
  10. oracle 时间集合,oracle 日期函数集合(集中版本)第2/2页
  11. 计算机必修课程英语单词,《计算机专业英语》课程标准.doc
  12. 关于socket的一些总结
  13. 将矩阵转为一行_理解矩阵乘法
  14. LLVM 4中将加入新的LLVM链接器LLD
  15. matplotlib常用绘图方法【转】
  16. wps怎么将字体变得很大_wps如何将字体无限放大
  17. 韩立刚计算机网络笔记-第01章 计算机网络详解
  18. docker,deamon.json文件说明
  19. 360全景倒车影像2017年最新十大品牌排名
  20. 2022年茶艺师(中级)证考试及茶艺师(中级)模拟考试题库

热门文章

  1. 【成像】【1】Terahertz辐射
  2. TC358779XBG HDMI 转 MIPI DSI
  3. excel表格导出之后身份证号列变成了科学计数法
  4. arduino 读取当前时间_Arduino 101/Genuino 101 时间控制函数
  5. 计算机系统故障常用检测及排除方法有哪些,常见电脑故障有哪些 电脑故障解决方法介绍【详解】...
  6. Jquery 实现H5页面上拉加载更多
  7. HCIE 华为虚拟化解决方案2
  8. es安装插件 ik ansj pinyin
  9. J2ME开发环境搭建 之 Sun WTK(转)
  10. python字符串的大小写转换