使用WinFrom + CefSharp 开发客户端程序
今天使用CefSharp,加上本地资源文件嵌入了HTML、CSS、JS文件,做为Winform的UI;效果不错,漂亮可控,简简单单,半天时间搞定从开发到上线;
下面记录下相关的备忘:
(窗口的效果)

关闭按钮和最小化按钮,使用JS交互调WIN窗口实现;
重点讲资源文件的嵌入:
1、直接向Resorces文件夹添加文件或文件夹;添加完毕后,每个文件属性需要选择为“嵌入的资源”,才会随程序编译一并打包进程序中;
2、关键的解析:
var ns = ass.GetManifestResourceNames();
通过这个语句,可以在调试中查看到所有资源的路径;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using CefSharp; namespace mssClient.Helper
{
/// <summary>
/// https://qwqaq.com/ee43a4af.html
/// </summary>
public class ResourceSchemeHandler:CefSharp.ResourceHandler
{
public override bool ProcessRequestAsync(IRequest request, ICallback callback)
{
var names = this.GetType().Assembly.GetManifestResourceNames(); Console.WriteLine(names); Uri u = new Uri(request.Url);
String file = u.Authority + u.AbsolutePath; // 注:目录名需全为小写字母,否则将无法得到 Resource Assembly ass = Assembly.GetExecutingAssembly();
String resourcePath = ass.GetName().Name + ".Resources." + file.Replace("/", "."); // 你可以设置断点看看这里的值
var ns = ass.GetManifestResourceNames();
Task.Run(() =>
{
using (callback)
{
if (ass.GetManifestResourceInfo(resourcePath) != null)
{
Stream stream = ass.GetManifestResourceStream(resourcePath);
string mimeType = "application/octet-stream";
switch (Path.GetExtension(file))
{
case ".html":
mimeType = "text/html";
break;
case ".js":
mimeType = "text/javascript";
break;
case ".css":
mimeType = "text/css";
break;
case ".png":
mimeType = "image/png";
break;
case ".appcache":
break;
case ".manifest":
mimeType = "text/cache-manifest";
break;
}
// Reset the stream position to 0 so the stream can be copied into the underlying unmanaged buffer
stream.Position = 0;
// Populate the response values - No longer need to implement GetResponseHeaders (unless you need to perform a redirect)
ResponseLength = stream.Length;
MimeType = mimeType;
StatusCode = (int)HttpStatusCode.OK;
Stream = stream;
callback.Continue();
}
else
{
callback.Cancel();
}
}
}); return true;
}
}
}
下面是协议注册类,写在 Program.cs 中,包含协议注册、CEF初始化代码等;
//CEF
try
{
CefSettings settings = new CefSettings(); //设置浏览器的UA,将用户等信息放到这里,事实上,Winform应该是先启动登录窗口,登录成功后再隐藏登录窗口并显示主窗口。
//settings.UserAgent = "Mss Application Client;"; //设置语言环境为中文环境
settings.Locale = "zh-CN"; //禁用日志输出
settings.LogFile = AppDomain.CurrentDomain.BaseDirectory + "Logs\\chromeWebBrowserDebug.log";
settings.LogSeverity = LogSeverity.Disable; //注册自定义协议,用于读取exe中的资源文件
settings.RegisterScheme(new CefCustomScheme()
{
SchemeName = CustomSchemeHandler.SchemeName,
SchemeHandlerFactory = new CustomSchemeHandler(),
IsCorsEnabled = true,
IsSecure = false
}); //注册自定义协议,用于读取本地程序根目录下的文件
settings.RegisterScheme(new CefCustomScheme()
{
SchemeName = LocalScremeHandler.SchemeName,
SchemeHandlerFactory = new LocalScremeHandler(),
IsCorsEnabled = true,
IsSecure = false
}); //定义缓存目录,不然发布后可能会自动在桌面创建缓存目录
settings.CachePath = App.Instance.ChromeCacheDirectory; //AppDomain.CurrentDomain.BaseDirectory + "ChromeCache\\"; //Initialize cef with the provided settings
Cef.Initialize(settings); //必须做下面的设置,减少白屏的发生,这是CEFSHARP的BUG
if (!settings.MultiThreadedMessageLoop)
{
Application.Idle += (sender, e) => { Cef.DoMessageLoopWork(); };
} //必须使用该语句,在显示页面缩放时,启用高DPI缩放支持,否则页面会出现模糊化。事实上就是强制必须使用100%
Cef.EnableHighDPISupport();
}
catch (Exception ex) { }
//注册主窗口
Application.Run(App.Instance.WebLoginForm);
使用WinFrom + CefSharp 开发客户端程序的更多相关文章
- 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)
本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
- 〖Linux〗Qt+gsoap开发客户端程序,服务端地址设定的字符串转换处理
之所以写出来,是由于经常因为这个问题屡屡丢面子.. 一般情况下,QString转换成(char*),我们一般直接使用: char *str = qstr->text().toLatin1().d ...
- electron vue 开发客户端程序
文档知识点 https://electronjs.org/docs/tutorial/about (1)Electron通过将Chromium和Node.js合并到同一个运行时环境中,并将其打包为Ma ...
- C# 客户端程序调用外部程序的三种实现
简介 我们用C#来开发客户端程序的时候,总会不可避免的需要调用外部程序或者访问网站,本篇博客介绍了三种调用外部应用的方法,供参考 实现 第一种是利用shell32.dll,实现ShellExecute ...
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (二)想对DBExpress的TSQLDataSet写对数据库操作的SQL语句出错了!
当我们搞定DataSnap后,我们进入客户端程序开发阶段了,我们建立了客户端模块后,打算按照刚才开发服务器的步骤开发客户端程序,随后加入了DBExpress的TSQLDataSet,设定数据库连接后, ...
- Linux下用gSOAP开发Web Service服务端和客户端程序
网上本有一篇流传甚广的C版本的,我参考来实现,发现有不少问题,现在根据自己的开发经验将其修改,使用无误:另外,补充同样功能的C++版本,我想这个应该更有用,因为能用C++,当然好过受限于C. 1.gS ...
- WCF开发实战系列五:创建WCF客户端程序
WCF开发实战系列五:创建WCF客户端程序 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在前面的三篇文章中我们分别介绍了WCF服务的三种载体:IIS.Self-Hos ...
- Linux下用gSOAP开发Web Service服务端和客户端程序(一)
1.功能说明: 要开发的Web Service功能非常简单,就是一个add函数,将两个参数相加,返回其和. 2.C版本的程序: (1)头文件:SmsWBS.h,注释部分不可少,url部分的IP必须填写 ...
- java websocket开发的客户端程序
最近用java websocket开发的客户端程序,在和服务端链接通后,在数据传输完毕后,客户端自动关闭了链接,如何能保持链接不断开 这个是客户端的启动类,在循环完毕后,会自动断开和服务器的链接,开始 ...
随机推荐
- python 格式化输出%s %f %d
格式说明由%和格式字符组成,如%f,它的作用是将数据按照指定的格式输出.格式说明是由“%”字符开始的. 1.整型输出%d print 'my age is %d'% (26) 说明:%d相当于是一个占 ...
- Centos7安装Spark2.4
准备 1.hadoop已部署(若没有可以参考:Centos7安装Hadoop2.7),集群情况如下(IP地址与之前文章有变动): hostname IP地址 部署规划 node1 172.20.0.2 ...
- [VSCode] Adding Custom Syntax Highlighting to a Theme in VSCode
VSCode Themes are a quick way to update the color scheme and syntax highlighting of your code, but y ...
- webpack的loader的原理和实现
想要实现一个loader,需要首先了解loader的基本原理和用法. 1. 使用 loader是处理模块的解析器. module: { rules: [ { test: /\.css$/, use: ...
- render函数、createElement函数与vm.$slots
1.render函数.createElement函数 Vue.component('es-header', { render: function (createElement) { return cr ...
- shell脚本编程基础知识点
整数比较: -eq:测试两个整数是否相等:相等为真,不等为假 -ne:测试两个整数是否不等:不等为真,相等为假 -gt:测试一个数是否大于另一个数:大于为真,否则为假 -lt:测试一个数是否小于另一个 ...
- GoCN每日新闻(2019-10-26)
GoCN每日新闻(2019-10-26) 1. GateKeeper:滴滴开源的使用Go编写的不依赖分布式数据库的API网关 https://mp.weixin.qq.com/s/gpQSPJ-uRp ...
- 微信小程序 Flex局部元素被挤压问题
关于Flex布局不在此处赘述,需要了解的可以查阅官方文档:基本的布局方法——Flex布局 当使用Flex布局,想实现如下图1的效果时,代码编写如下: 图1: <!-- wxml文件 --> ...
- 在js中添加HTML类样式
有时候需要给元素添加类样式,但又要保留之前的类,可以使用element.classList.add("类名");
- 编译失败,无法安装APK
编译失败,无法安装APK. 把libs目录中,全部内容清空,再重新编译就可以了. 应该是有些组件有冲突的原因! -------------------------------------------- ...