分类目录归档:C#

winform webbrowser 版本修改

在winform的程序里面内嵌了一个webbroswer,但是使用发现webbroswer的兼容性很差,查看了一下内核,发现是IE7的,所以以为是vs自带的低版本的IE,但是查找答案后发现,没有安装IE的电脑是无法使用webbroswer的,因此,webbroswer首先是依赖于IE的,只是默认版本是IE7

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);
            // enable the features which are "On" for the full Internet Explorer browser  
            //不晓得设置有什么用  
            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;
        }

使用时:SetWebBrowserFeatures(11);

在线测试网址:https://tool.lu/useragent/

c# 获取网页信息 url

c# 获取网页信息 url


string uri1 = “http://www.hscode.net/Goods/GetHsCodeInfo/?hscode=” + hscode;
var request = WebRequest.Create(uri1);
request.Method = “GET”;
var response = request.GetResponse();
using (var stream = new System.IO.StreamReader(response.GetResponseStream()))
{
var content = stream.ReadToEnd();//获取到远程的页面字符串
}

竹苞

1.先通过cefsharp调用js.获取当前登录人信息,总是报错,出现在uncaught referenceerror is not defined 错误.

2.通过页面重新加载,执行加载函数init(),读到登陆信息,失败

3.通过cookie获取,发现cookie里面没有.失败

4.在localStorage中发现有记录登录人姓名信息.谷之.发现chrome的locastorage是通过sqlite读写的,进去发现保存内容为blob.

直接select不行,放弃

5.发现可以用JavaScript的方式直接来读localstorage.

var ss=localStorage[‘login_saveInfo’]; alert(ss);

最终代码

Task<CefSharp.JavascriptResponse> t = browser.EvaluateScriptAsync(“function login(){var ss=localStorage[‘login_saveInfo’]; return ss;} login();”);
// 等待js 方法执行完后,获取返回值

t.Wait();
// t.Result 是 CefSharp.JavascriptResponse 对象
// t.Result.Result 是一个 object 对象,来自js的 callTest2() 方法的返回值
if (t.Result.Result != null)
{
//MessageBox.Show(t.Result.Result.ToString());

todo();
}

IPPBX不使用ocx的解决思路

使用winform_cefsharp的搭配处理

1.坐席登陆,通过JS获取到已经登陆到系统的账号信息,再根据坐席分配表获取到对应的坐席信息,连接CTI,登陆坐席.

2.外拨事件:在页面上增加JS函数,参数为需要外拨的号码.JS函数回调C#的外拨功能.拨出电话

3.挂机后.坐席状态改变触发写日志的功能.

 

内嵌浏览器和自动登陆的那些坑

多年前写过一个内嵌的浏览器,并做了自动登陆的功能,现在因为要增加部分功能,发现webbrowser 有两个坑

1.默认使用的是IE7的内核,如果想使用高版本的IE,需要修改注册表.这样不利于推广使用

2.随着判断的增多,加载的时间越来越长.

准备 进cefsharp的坑

cefsharp 测试时遇到的几个问题:

1.检测页面加载完成

2.多开页面是重新加载的问题.

未能加载文件或程序集“CefSharp.Core.dll”或它的某一个依赖项。找不到指定的模块

此报错需要安装C++运行环境(Microsoft Visual C++ 2013 Redistributable (x86) )  就算本地系统是64位的,运行环境也是要装X86的

下载地址:  https://www.microsoft.com/zh-CN/download/details.aspx?id=40784