使用场景

使用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. Redis的文件格式
  2. iphone屏蔽系统更新_未越狱屏蔽系统更新还是来了
  3. 【风险管理】风控决策系统
  4. 买房应该少出首付,多贷款
  5. 数学上人可以永生!这是什么原理?
  6. JS 动态清除Div中内容
  7. sql server 性能分析工具
  8. 【报告分享】斯坦福-2019人工智能指数年度报告.pdf(附293页报告现在链接)
  9. 判断素数的方法(java)
  10. c语言怎么return ok,C语言中的 return与exit
  11. linux使用iptables屏蔽ip段,利用iptables屏蔽IP段
  12. app系统软件开发外包的费用:开发app多少钱的费用?
  13. python开源项目及示例代码(转)
  14. 【linux内核分析与应用-陈莉君】物理内存分配与回收机制下
  15. 深入浅出移动直播技术之帧率、码率和分辨率
  16. Eclipse官网快速下载
  17. 在外企必会的英文单词
  18. 易飞ERP进货单源码——复制报价单
  19. AMetal平台学习——初步了解篇
  20. Python学习笔记——流程控制(拉勾教育数据分析实战训练营学习笔记)

热门文章

  1. 【Java】Java实现贪吃蛇小游戏(带详细注释)
  2. 百度网盘分享——电子专业学习视频教程
  3. 进化算法--遗传算法
  4. vcruntime140_1.dll下载及安装【vcruntime140_1.dll丢失的解决方法】
  5. Hybrid与h5使用webview+JSBridge实现通信原理简析
  6. [Oracle datagard]从库恢复之 ORA-16032: parameter ORA-07286:问题
  7. HTTP下载文件校验失败原因分析与解决
  8. 电商项目的并发量一般是多少_【高并发】高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!...
  9. MySQL数据库集群实现负载均衡的安装配置详解
  10. 如何理解三维向量叉乘