C#搞跨平台UI,封装Cef作为Cpf的控件支持Windows,Linux,Mac
终于封装完成了,采用离屏渲染方式,支持JS和C#互相调用,C#方法自动绑定到JS里,中文输入有自动调整输入法位置。
基于开源的CefGlue 移植,本来想用CefSharp,不过这个里面有很多C++的,而且很多代码还是基于Windows编写的,不好移植成跨平台的。
不过CefGlue 里的功能不够完善,没有带JS远程调用功能,Cef是多进程的,JS调用需要在渲染进程,那就需要主进程发送消息给渲染进程来调用JS,还要把调用结果发送回主进程,很麻烦。我这边是采用管道通讯。
C#注册方法到JS里的时候,需要先反射获取方法名,根据方法名注册到JS里,注册之后的方法在被调用的时候,渲染进程会有回调,把回调里的参数和数据信息发送到主进程,再根据参数以及反射获取的C#方法的参数类型对比,并转换为相应的C#数据类型,再调用该C#方法,最后还要把C#调用的结果返回到渲染进程。现在只做了常用的数据类型转换,比如 string,int,double等这些,其他类型转换暂时不支持。
封装不同系统平台,有很多细节不同,有很多坑,比如:
1、MultiThreadedMessageLoop 在Mac里不支持,那你就需要另外搞个Timer,不断调用DoMessageLoopWork
2、由于Mac里的特殊的进程机制,你还需要在CommandLine调用SetProgram设置程序路径,否则无法启动子进程,关键子进程还自带任务栏图标,你还需要想办法把子进程任务栏图标隐藏,cef默认例子里就是靠多个程序目录,里面配置Info.plist为后台进程来隐藏子进程图标。
3、Linux里的话,还需单独设置CommandLine 禁用GPU,设置no-zygote
4、Mac里必须将键盘事件的Characters和UnmodifiedCharacter传给cef,否则还没法触发事件,另外还必须用系统的原生KeyCode设置给cef的键盘事件的NativeKeyCode,而Windows和Linux是设置WindowsKeyCode
5、Xamarin.Mac里有个坑,你无法继承NSApplication重写并增加方法属性,由于CPF.Mac采用的是精简版的Xamarin.Mac,而Xamarin.Mac采用的是绑定原生API的方式实现的,但是对NSApplication的子类没有实现自动注册功能,就是你继承扩展的子类无法在Object-C里获取到对应的对象。而cef在Mac端要求主程序的NSApplication增加IsHandlingSendEvent属性,没有这个属性就无法运行,好在Object-C支持类的动态增加属性,手动调用注册属性就好了
6、cef里封装的输入法搞的真麻烦,明明只要提供个获取光标位置的接口就行,却还搞个拼写过程输入效果,不调用这些接口还无法触发获取光标位置的回调,本来这个功能输入法提供就行的,cef里搞这个功能很坑,尤其是文本框限制字符数量的时候,比如文本框限制最大字符数是2,那你输入中文的时候,用拼音输入,就无法直接完整的拼写完两个中文字符,因为这个长度限制还会限制拼写过程的字母数量。好在可以规避掉这个拼写功能。
去 https://cef-builds.spotifycdn.com/ 下载cef二进制文件有个大坑,就是Linux的libcef.so文件都是1个G的,太大了,估计是配置文件写错了,就只能自己编译过。其他系统平台的都只有100多M。
最终封装成cpf的控件使用就很方便了,案例源码:http://cpf.cskin.net/Item/19



C#搞跨平台UI,封装Cef作为Cpf的控件支持Windows,Linux,Mac的更多相关文章
- 将webkit内核封装为duilib的浏览器控件
转载请说明出处,谢谢~~ 原本的duilib是自带浏览器控件的,但是使用了IE内核,我在做仿酷狗音乐播放器时,在右侧乐库要用到浏览器控件,而我使用自带的IE控件却发现了不少缺点,这也是duilib一直 ...
- WPF里面多线程访问UI线程、主线程的控件
如果出现以下错误:调用线程无法访问此对象,因为另一个线程拥有该对象. 你就碰到多线程访问UI线程.主线程的控件的问题了. 先占位.
- 【Android】11.0 UI开发(二)——列表控件ListView的简单实现1
************************ 转载请注明出处:https://www.cnblogs.com/xiaofu007/p/10342462.html ***************** ...
- 深入理解MVC C#+HtmlAgilityPack+Dapper走一波爬虫 StackExchange.Redis 二次封装 C# WPF 用MediaElement控件实现视频循环播放 net 异步与同步
深入理解MVC MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性 ...
- Duilib源码分析(五)UI布局—Layout与各子控件
接下来,继续分析duilib之UI布局Layout,目前提供的布局有:VerticalLayout.HorizontalLayout.TileLayout.TabLayout.ChildLayout分 ...
- JavaScript封装一个实用的select控件
最近一直把精力放在项目上面,导致忽略的一些底层的东西.以前就一直觉得原有的select控件很丑,正好周末有时间,试着做了一个简单封装,实现了它的基本功能.我总结了一下,大概分为三个部分: 1.对显示样 ...
- .Net Core使用视图组件(ViewComponent)封装表单文本框控件
实例程序的界面效果如下图所示: 在表单中的搜索条件有姓名,学号,成绩.他们在一行中按照水平三等分排列. 在cshtml中用html实现上述表单效果的的代码如下: <form class=&quo ...
- 如何封装属于自己的WPF控件库
在网上找了一下,发现这方面的资料并不多.做传统桌面的本来就不多了吧,更别说WPF了.我可能也要另寻出路了,不过我还是觉得做桌面挺有意思的. 言归正传 首先,新建一个WPF自定义控件库项目 这里我们封 ...
- Qt项目ui文件中新添加的控件在代码中不识别的问题解决
今天在学Qt框架的信号槽,然后发现在ui中加的控件,通过ui-> 找不到,没有识别,于是上网查找了一下问题 解决方法 添加ui控件后,执行程序,退出程序,将debug目录下的ui_XXXX.h拷 ...
随机推荐
- Linux提权
讲Linux提权之前,我们先看看与Linux有关的一些知识: 我们常说的Linux系统,指的是Linux内核与各种常用软件的集合产品,全球大约有数百款的Linux系统版本,每个系统版本都有自己的特性和 ...
- 【vue-04】模块化开发
组件化开发,一般是将重复的代码抽取成一个组件,供其他地方复用,一般情况下,提到组件化开发,都是指前端的组件化开发. 模块化开发,一般是将同一类功能模块的代码放到一起统一进行管理,是基于代码层面的,一般 ...
- 【c#】 使用Directory.GetFiles获取局域网中任意电脑指定文件夹下的文件
本文为老魏原创,如需转载请留言 格式如下: // 获取IP地址为10.172.10.167下D盘下railway下的所有文件 string[] picArray = Directory.GetFile ...
- SQL注入:Sqlmap初体验
目录 sqlmap 安装 查看帮助文档 中文文档 直连数据库 服务型数据库(mysql) 文件型数据库(sqlite) 初级实战 1. 扫描注入点 2. 根据注入点查到全部数据库 --dbs 3. 根 ...
- MySQL从库维护经验分享
前言: MySQL 主从架构应该是最常用的一组架构了.从库会实时同步主库传输来的数据,一般从库可以作为备用节点或作查询使用.其实不只是主库需要多关注,从库有时候也要经常维护,本篇文章将会分享几点从库维 ...
- CodeForces - 879
A 题意:就是一共有n个医生,每个医生上班的时间是第Si天,之后每隔d天去上班,问最少多少天能够访问完这n名医生 思路:直接进攻模拟就可以 代码: 1 #include<iostream> ...
- KMP(The Knuth-Morris-Pratt Algorithm)
本文代码来自于中国大学MOOC KMP课件下载 注释内容为自己理解,如有错误请评论,或者私信给我,谢谢 #include <stdio.h> #include "stdlib.h ...
- Java线程池的工作流程
线程池刚被创建的时候,只是向系统里申请一个用于执行流程队列和管理线程池的线程资源.在调用execute()添加一个任务时,线程池会按照以下流程执行: 1.如果正在运行的线程数少于corePoolSiz ...
- 记一次golang内存泄露
记一次golang内存泄露 最近在QA环境上验证功能时,发现机器特别卡,查看系统内存,发现可用(available)内存仅剩200多M,通过对进程耗用内存进行排序,发现有一个名为application ...
- [bug] Container killed on request. Exit code is 143
原因 内存不足 参考 https://blog.csdn.net/hongxiao2016/article/details/88919606 https://blog.csdn.net/Zsigner ...