C# WebBrowser无法跳转默认浏览器问题

这篇具有很好参考价值的文章主要介绍了C# WebBrowser无法跳转默认浏览器问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用场景

使用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 11
		switch (browserVersion)
		{
			case 7:
				mode = 7000; // Internet Explorer 7
				break;
			case 8:
				mode = 8000; // Internet Explorer 8
				break;
			case 9:
				mode = 9000; // Internet Explorer 9
				break;
			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 sink
	protected override void CreateSink()
	{
		//MAKE SURE TO CALL THE BASE or the normal events won't fire
		base.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 navigating
	public 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 events
		cancel = args.Cancel;
	}

	//This class will capture events from the WebBrowser
	class WebBrowserExtendedEvents : System.Runtime.InteropServices.StandardOleMarshalObject, DWebBrowserEvents2
	{
		ExtendedWebBrowser _Browser;
		public WebBrowserExtendedEvents(ExtendedWebBrowser browser) { _Browser = browser; }

		//Implement whichever events you wish
		public 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文章来源地址https://www.toymoban.com/news/detail-465069.html

到了这里,关于C# WebBrowser无法跳转默认浏览器问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python:webbrowser --- 方便的 Web 浏览器控制工具

    webbrowser 模块提供了一个高层级接口,允许向用户显示基于 Web 的文档。 在大多数情况下,只需调用此模块的 open() 函数就可以了。 在 Unix 下,图形浏览器在 X11 下是首选,但如果图形浏览器不可用或 X11 显示不可用,则将使用文本模式浏览器。 如果使用文本模式浏览器,则调

    2024年02月09日
    浏览(43)
  • C# 在win10/win11调用默认浏览器打开网页

    对于使用C#调用默认浏览器打开网页这个话题,网上资源一般都用的是 Registry.ClassesRoot.OpenSubKey(@\\\"httpshellopencommand\\\"); 或者 System.Diagnostics.Process.Start(\\\"explorer.exe\\\", \\\"...\\\") 之类,但在实践过程中发现前者在Windows 10之后修改默认浏览器并不会修改注册表的这一字节而导致只会调用

    2024年02月13日
    浏览(63)
  • 《Python入门到精通》webbrowser模块详解,Python webbrowser标准库,Python浏览器控制工具

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 小白零基础《Python入门到精通》 webbrowser 是Python的内置库,提供了访问Web浏览器的接口 使用前需要 「导入模块」 1)使用 「默认浏览器」 打开

    2024年02月10日
    浏览(44)
  • 解决一打开IE浏览器就自动跳转到Edge浏览器的问题

    打开Internet Explorer浏览器后会自动跳转到Microsoft Edge浏览器。 打开控制面板,选择“Internet选项”,选择【高级】选项卡,取消勾选“启用第三方浏览器扩展*”即可。

    2024年02月11日
    浏览(77)
  • 浏览器提示无法安全地连接到此页面TLS安全设置未设置为默认怎么办?

    win10系统是计算机操作系统的使用,最近可用,最近,在使用Windows10操作系统时无法打开一些网站,打开时间提示:无法连接到此页面,这可能是因为该网站使用国有企业或不安全TLS安全设置。如何解决这个问题?以下小系列为您带来了详细的解决方案,让我们看看!     解

    2024年02月12日
    浏览(61)
  • 彻底解决浏览器输入http被自动跳转至https问题

    第一种方法 1.地址栏中输入chrome:// net -internals/#hsts。 2.在Delete domain中输入删除项目的域名,并Delete(删除) 注意是去掉http://前缀的网址,如:baidu.com Delete domain中输入项目的域名之后,需要再清一下浏览器缓存 注意,如果你又手动跳转了https,那就得重来一次。 第二种方法:

    2024年02月05日
    浏览(52)
  • 浏览器无法连接网络问题

    电脑其他程序都能正常联网,但是所有的浏览器都无法联网,同时外部网站都能ping通 查看电脑Internet连接的问题报告显示: 该设备或资源(Web 代理)未设置为接受端口\\\"7890\\\"上的连接 。 经过检查发现不是IP地址设置和防火墙设置的问题,最终 采用重置网络设置解决了问题 。 重

    2024年02月13日
    浏览(43)
  • 谷歌浏览器禁用https,解决http自动跳转https的问题

    浏览器地址栏中输入  chrome://net-internals/#hsts 然后在  Delete domain security policies 下输入需要禁用https协议的网址

    2024年02月11日
    浏览(63)
  • selenium无法打开浏览器问题

    想利用这个例子简单测试一下安装是否成功? from selenium import wbdriver driver = weddriver.Chrom() driver.get(‘http://www.baidu.com’) 前提是:浏览器版本和浏览器驱动版本是一致的,具体怎么看版本是否是一致的,下期再给大家补充 结果报如下错误: 在安装浏览器的时候浏览器的名字都

    2024年02月11日
    浏览(69)
  • 解决浏览器无法自动播放音频的问题

    项目场景:要求根据后台返回数据做一个语音提示功能 浏览器报Uncaught (in promise) DOMException: play() failed because the user didn’t interact with the document first. 由于浏览器为了避免自动播放音频打扰用户,因此浏览器做出了限制,只有用户与浏览器交互,如点击事件等等,才会播放音频

    2024年02月12日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包