CEF js调用C#封装类含注释

/*
 * CEF JS调用C#组装类
 * 
 * 使用方法(CefGlue为例):
 *  public class BrowserRenderProcessHandler : CefRenderProcessHandler
    {
 *      //自定义Handler
        private TestBrowserHandler _testHandler = null;
 * 
 *      protected override void OnWebKitInitialized()
 *      {          
 *           _testHandler = new TestBrowserHandler();
 *           CefRuntime.RegisterExtension(_testHandler.GetType().Name, _testHandler.Javascript.Create(), _testHandler);
 *      } 
 *  }
 * 
 *  /// <summary>
    /// 测试Handler
    /// </summary>
    public class TestBrowserHandler : CefV8Handler
    {
        public GenerateJavascriptFull Javascript = null;
 * 
 *       public TestBrowserHandler()
         {
            Javascript = new GenerateJavascriptFull("plugins", "test");
 *          // getHello的参数数量,可进一步封装。表示接受一个参数
            Javascript.AddMethod("gethello", "arg0");
 *          // getHello的参数数量,可进一步封装。表示接受二个参数
            Javascript.AddMethod("sethello", "arg0","arg1");
 *          //表示无参
 *          Javascript.AddMethod("sethello");
            Javascript.AddGetProperty("hello", "gethello");
            Javascript.AddSetProperty("hello", "sethello", "arg0");
            Javascript.AddMethod("start", "arg0");
            Javascript.AddMethod("stop");
 * 
 *          //这里表示浏览器JS增加了: window.plugins.test 对象
 *          // window.plugins.test.gethello()
 *          // window.plugins.test.sethello("123")
 *          //断点在 Execute(**)中
         }
 * 
 *   protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception)
        {
            try
            {
                returnValue = CefV8Value.CreateNull();
                switch (name)
                {
                    case "gethello":
                        //returnValue = CefV8Value.CreateString(GetHello());
                        if (arguments.Length == 1 && arguments[0].IsFunction)
                        {
                            CefV8Value[] args = new CefV8Value[1];
                            args[0] = CefV8Value.CreateString(GetHello());
                            returnValue = arguments[0].ExecuteFunction(null, args);
                        }
                        break;
                    case "sethello":
                        returnValue = CefV8Value.CreateBool(SetHello(arguments[0].GetStringValue()));
                        break;


                    case "start":
                        if (arguments.Length == 1 && arguments[0].IsFunction)
                        {


                            CefV8Context context = CefV8Context.GetCurrentContext();
                            //这里定义异步调用方式
                            new Thread(new ThreadStart(delegate()
                            {
                                while (isStart)
                                {
                                    System.Threading.Thread.Sleep(1000);
                                    string timer = DateTime.Now.ToString();
 *                                  //TestTimerTask继承CefTask
                                    CefRuntime.PostTask(CefThreadId.Renderer, new TestTimerTask(context as CefV8Context, arguments[0], new object[] { timer }));
                                }
                            })).Start();
                            returnValue = CefV8Value.CreateBool(true);
                        }
                        break;
                    case "stop":
                        isStart = false;
                        returnValue = CefV8Value.CreateBool(true);
                        break;                   
                }


                exception = null;
                return true;
            }
            catch (Exception e)
            {
                returnValue = null;
                exception = e.Message;
                return false;
            }
        }
 * }
 * 
 * 
 * 
 * 
 * 
 */


using System;
using System.Collections.Generic;
using System.Text;


namespace G.DeskCommon
{
    /// <summary>
    /// 组装JS
    /// </summary>
    public class GenerateJavascriptFull
    {
        string _extensionName = string.Empty;
        string _functionName = string.Empty;
        Dictionary<string, string[]> _methodName = new Dictionary<string, string[]>();


        //
        Dictionary<string, string> _getterPropertyName = new Dictionary<string, string>();


        // 保存setter 名称 和参数。 与 _setterPropertyArgs 成对出现。
        Dictionary<string, string> _setterPropertyName = new Dictionary<string, string>();
        Dictionary<string, string[]> _setterPropertyArgs = new Dictionary<string, string[]>();


        //自定义javascript代码
        List<string> _customJavascript = new List<string>();


        /// <summary>
        /// 
        /// </summary>
        /// <param name="extensionName">
        /// 插件方法作用域
        /// e.g: window.plugin.test
        /// 其中 plugin 为作用域. 如不设置,添加的js方法在window下.
        /// </param>
        /// <param name="functionName">
        /// 
        /// </param>
        public GenerateJavascriptFull(string extensionName, string functionName)
        {
            _extensionName = extensionName;
            _functionName = functionName;
        }


        /// <summary>
        /// 增加方法
        /// </summary>
        /// <param name="methodName">方法名称</param>
        /// <param name="args">参数名:arg0,arg1,...arg20 (固定写死)</param>
        public void AddMethod(string methodName, params string[] args)
        {
            //检测是否存在改方法
            if (_methodName.ContainsKey(methodName))
                return;
            _methodName.Add(methodName, args);
        }


        /// <summary>
        /// 增加Getter属性
        /// </summary>
        /// <param name="propertyName">属性名称</param>
        /// <param name="executeName">执行名称,CEF handler中execute的Name参数同名</param>
        public void AddGetProperty(string propertyName, string executeName)
        {
            if (_getterPropertyName.ContainsKey(propertyName))
                return;


            _getterPropertyName.Add(propertyName, executeName);
        }


        /// <summary>
        /// 增加Setter属性
        /// </summary>
        /// <param name="propertyName">属性名称</param>
        /// <param name="executeName">执行名称,CEF handler中execute的Name参数同名</param>
        /// <param name="args">参数名:arg0,arg1,...arg20 (固定写死)</param>
        public void AddSetProperty(string propertyName, string executeName, params string[] args)
        {
            if (_setterPropertyName.ContainsKey(propertyName) || _setterPropertyArgs.ContainsKey(propertyName))
                return;


            _setterPropertyName.Add(propertyName, executeName);
            _setterPropertyArgs.Add(propertyName, args);
        }


        /// <summary>
        /// 增加自定义的javascript代码。
        /// </summary>
        /// <param name="javascriptCode">注意:functionName一定要大写。
        ///  例如:  TEST.__defineSetter__('hello', function(b) {
        ///  native function sethello();sethello(b);});</param>
        public void AddCustomJavascript(string javascriptCode)
        {
            _customJavascript.Add(javascriptCode);
        }


        /// <summary>
        /// 组装本地JS的一个过程
        /// </summary>
        /// <returns>返回CEF识别的javascript</returns>
        public string Create()
        {
            //System.Threading.Thread.Sleep(3000);
            if (string.IsNullOrEmpty(_functionName)) throw new Exception("JavascriptFull函数名不能为空!");


            StringBuilder sb = new StringBuilder();


            //头部
            if (!string.IsNullOrEmpty(_extensionName))
            {
                sb.Append(string.Format("if (!{0}) var {0} = {{ }}; ", _extensionName));
            }
            if (!string.IsNullOrEmpty(_functionName))
            {
                sb.Append(string.Format("var {0} = function () {{ }}; ", _functionName.ToUpper()));
                if (!string.IsNullOrEmpty(_extensionName))
                    sb.Append(string.Format("if (!{0}.{1}) {0}.{1} = {2};", _extensionName, _functionName, _functionName.ToUpper()));
                else
                    sb.Append(string.Format("if (!{0}) var {0} = {1};", _functionName, _functionName.ToUpper()));
            }


            //开始
            sb.Append("(function () {");


            //方法
            foreach (KeyValuePair<string, string[]> item in _methodName)
            {
                sb.Append(string.Format("{0}.{1} = function ({2}) {{", _functionName.ToUpper(), item.Key, string.Join(",", item.Value)));
                sb.Append(string.Format("native function {0}({1}); return {0}({1});", item.Key, string.Join(",", item.Value)));
                sb.Append("};");
            }


            //GET属性
            foreach (KeyValuePair<string, string> item in _getterPropertyName)
            {
                sb.Append(string.Format("{0}.__defineGetter__('{1}', function () {{", _functionName.ToUpper(), item.Key));
                sb.Append(string.Format("native function {0}(); return {0}();", item.Value));
                sb.Append("});");
            }


            //SET属性
            if (_setterPropertyArgs.Count == _setterPropertyName.Count)
            {
                foreach (KeyValuePair<string, string> item in _setterPropertyName)
                {
                    sb.Append(string.Format("{0}.__defineSetter__('{1}', function ({2}) {{", _functionName.ToUpper(), item.Key, string.Join(",", _setterPropertyArgs[item.Key])));
                    sb.Append(string.Format("native function {0}({1}); return {0}({1});", item.Value, string.Join(",", _setterPropertyArgs[item.Key])));
                    sb.Append("});");
                }
            }


            //自定义javascript
            for (int i = 0; i < _customJavascript.Count; i++)
            {
                sb.Append(_customJavascript[i]);
            }


            //结尾
            sb.Append("})();");


            return sb.ToString();
        }
    }

}


来源:http://www.cnblogs.com/hnsongbiao/p/4209155.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CefSharp是一个.NET包装器,它提供了对Chromium浏览器的访问。要调用javascript获取返回值,可以使用CefSharp的ExecuteScriptAsync()方法。该方法以脚本字符串作为参数,并返回Task类型的结果。这意味着您可以异步调用javascript函数,并在调用成功后获取返回值。 在执行javascript代码后,您将获取一个JavascriptResponse对象,其中包执行结果的字符串值和一个布尔值,指示脚本是否成功在浏览器中运行。如果脚本未成功执行,则会提供一个错误消息。 以下是一个简单的示例,它演示了如何使用CefSharp执行一个简单的javascript函数并获取返回值: ```csharp var task = browserControl.ExecuteScriptAsync("document.title"); task.ContinueWith(t => { if (!t.IsFaulted) { var response = t.Result; if (response.Success && response.Result != null) { //获取返回值 var result = response.Result.ToString(); MessageBox.Show(result); } else if (!response.Success) { //输出错误消息 MessageBox.Show(response.Message); } } }, TaskScheduler.FromCurrentSynchronizationContext()); ``` 在这个示例中,我们使用ExecuteScriptAsync()方法执行了一个简单的javascript代码(获取页面的标题),并使用ContinueWith()方法处理返回值。在ContinueWith()方法中,我们检查返回的JavascriptResponse对象是否包成功的结果,如果是,我们将结果存储在result变量中并显示在一个消息框中。 总之,CefSharp可以让我们方便的访问Chromium浏览器的功能,包括执行javascript代码并获取返回值。通过使用.ExecuteScriptAsync()方法,我们可以异步执行javascript代码,并在获取结果后轻松处理返回的JavascriptResponse对象。 ### 回答2: cefsharp是一款基于Chromium开源浏览器的.NET框架,它提供了一种方便的方式来嵌入浏览器引擎到你的应用程序中。如果想要使用cefsharp调用JS获取返回值,首先需要在.NET平台上使用C#编写代码。 我们可以通过cefsharp提供的接口获取浏览器引擎对象,然后通过该对象调用浏览器引擎中的JavaScript接口。最简单的方式是使用CEFSharp.DevTools,它提供了一系列的方法来处理JavaScript代码并返回结果。例如: ```csharp using CefSharp; using CefSharp.DevTools; using CefSharp.DevTools.DOM; var browser = new ChromiumWebBrowser("http://www.google.com"); //等待浏览器加载完成 browser.FrameLoadEnd += (sender, e) => { if (e.Frame.IsMain) { browser.ExecuteScriptAsync("document.body.style.zoom = \"200%\";"); var dom = browser.GetMainFrame().GetDevToolsSession(); var result = dom.EvaluateScriptAsync("document.title"); //通过Task异步等待返回结果 result.ContinueWith(task => { Console.WriteLine(result.Result.Result.Value); }, TaskContinuationOptions.OnlyOnRanToCompletion); } }; ``` 上述代码中,通过CreateDevToolsSessionAsync方法获取到DevToolsSession对象(即浏览器页面的DOM),然后通过EvaluateScriptAsync方法执行JS代码,最后通过ContinueWith方法等待返回结果。在这个例子中,我们通过执行document.title代码,读取了当前页面的标题信息。 需要注意的是,CEFSharp.DevTools仅在Chrome 63或以上版本中提供支持。如果您要运行旧版本的Chrome,请参考CEFSharp.CefSharpExtensions来实现类似的JavaScript代码处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值