C# 关于浏览器——WebBrowser篇

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

最近要写一个浏览器包裹一个网站,试了各种浏览器插件,记录一下。

第一个就是微软的WebBrowser,这个很容易,直接拖过来,然后写一下注册表调用IE11的内核显示,这个代码是抄的:

/// <summary>
        /// 修改注册表信息来兼容当前程序
        ///
        /// </summary>  
        static void SetWebBrowserFeatures(int ieVersion)
        {
            // don't change the registry if running in-proc inside Visual Studio  
            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\";

            //设置浏览器对应用程序(appName)以什么模式(ieMode)运行
            Registry.SetValue(featureControlRegKey + "FEATURE_BROWSER_EMULATION",
                appName, ieMode, RegistryValueKind.DWord);

            //为完整的Internet Explorer浏览器启用“打开”的功能         
            Registry.SetValue(featureControlRegKey + "FEATURE_ENABLE_CLIPCHILDREN_OPTIMIZATION",
                appName, 1, RegistryValueKind.DWord);


            Registry.SetValue(featureControlRegKey + "FEATURE_AJAX_CONNECTIONEVENTS",
                appName, 1, RegistryValueKind.DWord);


            Registry.SetValue(featureControlRegKey + "FEATURE_GPU_RENDERING",
                appName, 1, RegistryValueKind.DWord);


            Registry.SetValue(featureControlRegKey + "FEATURE_WEBOC_DOCUMENT_ZOOM",
                appName, 1, RegistryValueKind.DWord);


            Registry.SetValue(featureControlRegKey + "FEATURE_NINPUT_LEGACYMODE",
                appName, 0, RegistryValueKind.DWord);
        }

        /// <summary>  
        /// 获取浏览器的版本  
        /// </summary>  
        /// <returns></returns>  
        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>  
        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 11  
                    break;
            }
            return mode;
        }

然后在Form的Load里面写:

SetWebBrowserFeatures(11);//内核为11

就OK了,然后就是处理新窗口的问题了,这个有两种情况,一个是网页内容的新窗口,主要是target的处理,添加事件处理函数:

/防止在新窗口打开链接
        private void browser_NewWindow(object sender, CancelEventArgs e)
        {
            e.Cancel = true;
        }

        //替换掉网页中链接的新窗口属性
        private void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            //this.Text = this.browser.Document.Title;
            foreach (HtmlElement links in this.browser.Document.Links)
            {
                links.SetAttribute("target", "_self");
            }

            foreach (HtmlElement form in this.browser.Document.Forms)
            {
                form.SetAttribute("target", "_self");
            }
        }

还有一种是js的window.open,这个这样处理:在Form_Load里面写

 string jsHtml= "window.open=function(url, title, prop){window.external.jumpUrl(url);}";
mshtml.IHTMLDocument2 doc = browser.Document.DomDocument as mshtml.IHTMLDocument2;
                mshtml.IHTMLWindow2 win = doc.parentWindow as mshtml.IHTMLWindow2;
                win.execScript(jsHtml, "javascript");

需要引用Microsoft.mshtml,其中jumpUrl是程序自身的一个函数,处理传递过来的 Url,通常是直接load一下:

public void jumpUrl(string url)
        {            
            browser.Navigate(url);
        }

要从js里面调用函数,需要引用:

using System.Runtime.InteropServices;

然后在类前面写:

[System.Runtime.InteropServices.ComVisible(true)]
    public partial class mainForm : Form
    {

.......

然后就是各种加载导航操作什么的,这个没什么好说的。

一些坑:

1、这个对js的支持非常弱,尤其是用了jquery的操作,不确定性太多;

2、虽然用了IE内核,但并不是全部支持IE的功能,感觉也就是60~70的样子;

3、对客户机的环境依赖太多,需要装IE的高版本,FrameWorks、VS支持什么的。

总之,不推荐包装复杂的站点,否则就是噩梦。文章来源地址https://www.toymoban.com/news/detail-518469.html

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

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

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

相关文章

  • C# 实现浏览器控件设置

    2024年02月10日
    浏览(32)
  • C# 调用浏览器打开网址

    调用方法体 打开浏览器帮助类  

    2024年02月15日
    浏览(28)
  • C#完整版浏览器开发

    采用谷歌内核CefSharp进行开发,主要是为了实现JS交互,实现前端JS调用原生能力,如:相机、VLC视频能力(主要播放流视频)等。 实现主要功能: 浏览器标签、HTML页面能播放视频、下载记录、JS交互(能调用原生相机、调用VLC集成能力:流视频播放)、软件更新、自定义右

    2024年01月16日
    浏览(32)
  • 用C#破解Chrome浏览器cookie值

    背景 最近小编接到一个获取网站请求数据的需求,要求抓取网站某个页面请求的数据。我使用Google Chrome浏览器查看了一下请求链接的传入参数,发现需要传入一个Token值才能获取数据。于是我在Chrome中登录后,通过Postman请求成功,并将Token存储到了Cookie中。然而问题又来了,

    2023年04月18日
    浏览(24)
  • C# 在win10/win11调用默认浏览器打开网页

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

    2024年02月13日
    浏览(42)
  • UE4 关于使用Webbrowser插件遇到的问题以及解决办法

    解决办法:第一种办法,重新编译了cef源码,改成支持H.264,然后在UE4安装目录下替换相关文件,网上有教程自己搜。第二种办法是直接找改好的插件,桃宝 解决办法:使用webbrowser的ExecuteJavascript函数执行js代码,这段代码的大概意思就是将滑动条的长宽设置为0以此来达到隐

    2024年02月12日
    浏览(36)
  • 关于浏览器适配的方案

    如果需要使用  rem  单位进行适配,推荐使用以下两个工具: postcss-pxtorem 是一款 PostCSS 插件,用于将 px 单位转化为 rem 单位 lib-flexible 用于设置 rem 基准值 下面提供了一份基本的 PostCSS 示例配置,可以在此配置的基础上根据项目需求进行修改。 其他设计稿尺寸 如果设计稿

    2024年02月01日
    浏览(26)
  • 【Tricks】关于如何防止edge浏览器偷取chrome浏览器的账号

    前段时间edge自动更新了,我并没有太在意界面的问题。但是由于我使用同一个网站平台时,例如b站,甚至是邮箱,edge的账号和chrome的账号会自动同步,这就导致我很难短时间内切换账号,亦或是同时登录两个账号。 It is quite ANNOYING. 于是就有了这篇杂谈博客。这里特别感谢

    2024年02月07日
    浏览(47)
  • 记录--关于浏览器缓存策略这件事儿

    我们打开百度这个网站并刷新多次时时,注意到百度的logo是没有每次都加载一遍的。我们知道图片是img标签中的src属性加载出来的,这也需要浏览器去请求图片资源的,那么为什么刷新多次浏览器只请求了一次图片资源呢?这就涉及到了 浏览器的缓存策略 了,这张图片被浏

    2024年02月13日
    浏览(28)
  • 关于浏览器下载的时候出现失败,网络错误

    我试过所有浏览器,谷歌,firefox,qq浏览器,还是edge都不好使, 1.看网上说是http debugger的问题,但是我没有找到这个服务项 2.也有说可以通过修改或设置下载路径解决 --------  我通过下载一个叫xdm的软件,也就是类似迅雷这种软件,嵌在浏览器上作为插件,感觉没有出现中断

    2024年01月19日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包