今天使用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 开发客户端程序的更多相关文章

  1. 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)

    本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...

  2. 〖Linux〗Qt+gsoap开发客户端程序,服务端地址设定的字符串转换处理

    之所以写出来,是由于经常因为这个问题屡屡丢面子.. 一般情况下,QString转换成(char*),我们一般直接使用: char *str = qstr->text().toLatin1().d ...

  3. electron vue 开发客户端程序

    文档知识点 https://electronjs.org/docs/tutorial/about (1)Electron通过将Chromium和Node.js合并到同一个运行时环境中,并将其打包为Ma ...

  4. C# 客户端程序调用外部程序的三种实现

    简介 我们用C#来开发客户端程序的时候,总会不可避免的需要调用外部程序或者访问网站,本篇博客介绍了三种调用外部应用的方法,供参考 实现 第一种是利用shell32.dll,实现ShellExecute ...

  5. Delphi XE8中开发DataSnap程序常见问题和解决方法 (二)想对DBExpress的TSQLDataSet写对数据库操作的SQL语句出错了!

    当我们搞定DataSnap后,我们进入客户端程序开发阶段了,我们建立了客户端模块后,打算按照刚才开发服务器的步骤开发客户端程序,随后加入了DBExpress的TSQLDataSet,设定数据库连接后, ...

  6. Linux下用gSOAP开发Web Service服务端和客户端程序

    网上本有一篇流传甚广的C版本的,我参考来实现,发现有不少问题,现在根据自己的开发经验将其修改,使用无误:另外,补充同样功能的C++版本,我想这个应该更有用,因为能用C++,当然好过受限于C. 1.gS ...

  7. WCF开发实战系列五:创建WCF客户端程序

    WCF开发实战系列五:创建WCF客户端程序 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在前面的三篇文章中我们分别介绍了WCF服务的三种载体:IIS.Self-Hos ...

  8. Linux下用gSOAP开发Web Service服务端和客户端程序(一)

    1.功能说明: 要开发的Web Service功能非常简单,就是一个add函数,将两个参数相加,返回其和. 2.C版本的程序: (1)头文件:SmsWBS.h,注释部分不可少,url部分的IP必须填写 ...

  9. java websocket开发的客户端程序

    最近用java websocket开发的客户端程序,在和服务端链接通后,在数据传输完毕后,客户端自动关闭了链接,如何能保持链接不断开 这个是客户端的启动类,在循环完毕后,会自动断开和服务器的链接,开始 ...

随机推荐

  1. SQL操作Spark SQL--BasicSQLTestt

    object BasicSQLTest { def main(args: Array[String]): Unit = { val spark = SparkSession .builder() .a ...

  2. LeetCode 978. Longest Turbulent Subarray

    原题链接在这里:https://leetcode.com/problems/longest-turbulent-subarray/ 题目: A subarray A[i], A[i+1], ..., ...

  3. LeetCode 841. Keys and Rooms

    原题链接在这里:https://leetcode.com/problems/keys-and-rooms/ 题目: There are N rooms and you start in room 0. ...

  4. 程序复杂程度(步长) N

    我们知道计算机在运算时速度是固定的,程序运行的时间就与程序复杂程度有关.例如我们计算1-10相加 与 1-100相加,后者就要比前者多10倍时间. 例1  找出n个数中最大的一个  max= n[0] ...

  5. 关于异常System.ArgumentException

    什么是System.ArgumentException 当向方法提供的参数之一无效时引发的异常. 继承 Object Exception SystemException ArgumentExcepti ...

  6. RookeyFrame bin 目录

    如果把bin目录删掉,重新生成的话,还需要加载很多东西哦,具体可以对比一下下载下来的文件

  7. shell脚本编程基础知识点

    整数比较: -eq:测试两个整数是否相等:相等为真,不等为假 -ne:测试两个整数是否不等:不等为真,相等为假 -gt:测试一个数是否大于另一个数:大于为真,否则为假 -lt:测试一个数是否小于另一个 ...

  8. 一次修复linux的efi引导的集中方法总结记录

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/grub_uefi_repair 起因:EFI分区被删除导致引导问 ...

  9. 解决idea创建Maven项目速度慢

    idea在创建maven项目的时候会去网上自动下载需要的插件,这样就会导致项目创建后一直处于下载插件的状态中,影响开发效率 此时我们可以在创建maven骨架的时候,加入键值对来让maven调用本地的骨 ...

  10. IOC注解方式1.0

    在spring4之后,想要使用注解形式,必须得要引入aop的包 在配置文件当中,还得要引入一个context约束 <?xml version="1.0" encoding=& ...