一、背景

最开始准备使用的 Chromely 做一个终端机项目,本来以为挺顺利的一个事情折腾了两天半。由于无法直接控制窗体的属性,最后还是切换到 .NET Framework 4.8 + CefSharp,记录一下遇到的坑和问题。

二、问题

2.1 输入法无法弹出

终端机系统最开始是 Windows 7,系统自带的输入法无法输入中文,后面使用的多文输入法有时候能够输入有时候不能够输入。最后折腾了半天,咨询厂家可以安装 Windows 10,安装后系统自带输入法可以输入中文。

新的问题又出现了,如果窗口没有全屏的情况下,输入法是可以将内容输入到网页的文本框。但是窗口置顶且全屏,触摸 输入的内容就像无法获取焦点一样,无法输入。

爬了很多网站,都没有给出个明确的答案,最后在 某篇 Issue 里面说将 browser.FocusHandler 属性设置为 null,解决该问题。

2.2 重写右键菜单

这个问题比较简单,只需要重新实现 IMenuHandler 接口,替换掉 Cef Browser 的对应组件即可。

示例:

public class CustomMenuHandler : IContextMenuHandler
{
public void OnBeforeContextMenu(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model)
{
model.Clear(); model.AddItem((CefMenuCommand) 21000, "菜单项1");
} public bool OnContextMenuCommand(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId,
CefEventFlags eventFlags)
{
if (commandId == (CefMenuCommand) 21000)
{
MessageBox.Show("我是菜单项1");
}
return false;
} public void OnContextMenuDismissed(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame)
{
} public bool RunContextMenu(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model,
IRunContextMenuCallback callback)
{
return false;
}
}

2.3 身份证读卡器对接

身份证读卡器终端机上面是集成新中新的,跟着 SDK 的 Demo 来,一跑程序就炸。没有跑出任何异常,最后发现是 Chromely 吞掉了异常。实际的错误问题是 DLL 的版本不对,新中新只提供了 x86 的 DLL,但程序编译的是 x64。最后将程序的目标平台改为 x86 解决问题。

2.4 前端同后端通讯

其实就是 JS 调用后端的接口,之前搜索的文章都是 CefSharp 的老版本代码,最新的是使用 browser.JavascriptObjectRepository.Register() 注入处理器,然后前端再进行调用。具体代码可以参考 CefSharp 的 官方 Demo

2.5 打开调试窗口

CefSharp Browser 提供了一个 ShowDevTools() 方法用于打开调试窗口,需要注意的是,必须在浏览器完全初始化之后才能够调用。所以你需要判断一下 CefSharp Browser 的状态。

browser.IsBrowserInitializedChanged += (sender, args) =>
{
if (browser.IsBrowserInitialized)
{
browser.ShowDevTools();
}
};

2.6 关于触屏的其他配置

在 Cef 初始化的时候,需要对 Cef 进行一些其他的配置,例如开启触屏事件、禁用 USB 键盘等。

private static void InitializeCef()
{
CefSharpSettings.LegacyJavascriptBindingEnabled = true;
CefSharpSettings.SubprocessExitIfParentProcessClosed = true; Cef.EnableHighDPISupport(); var settings = new CefSettings();
settings.CefCommandLineArgs.Add("disable-usb-keyboard-detect", "1");
settings.CefCommandLineArgs.Add("enable-media-stream", "1");
settings.CefCommandLineArgs.Add("touch-events", "1"); Cef.Initialize(settings);
}

2.7 允许前端跨域和调用摄像头

在 [2.6](#2.6 关于触屏的其他配置) 一节中,我通过添加 enable-media-stream 参数让前端可以直接调用摄像头。如果想要让前端发起跨域请求,就得在 Browser 里面将 WebSecurity 属性设置为 Disabled

browser.BrowserSettings.WebSecurity = CefState.Disabled;

2.8 下载文件

CefSharp 针对于前端的下载文件动作进行了处理,如果你对于这个动作有自己的处理逻辑,可以实现 IDownloadHandler 接口。然后在 Browser 的对应属性替换成你自己的实现即可。

CefSharp 开发触屏终端遇到的问题记录的更多相关文章

  1. WPF环境下多点触屏开发的一些经验(转)

    本系列将介绍Multi-Touch(MT)多点触控技术的相关内容,使开发人员了解如何在Windows 平台中开发出具有MT 功能的应用程序.众所周知Windows 7 操作系统自身已经支持具有MT 功 ...

  2. 移动开单扫描终端-全触屏互联网安卓打印扫描 PDAPOS机——开单扫描POS-移动开单扫描POS

    浩瀚云POS是一款自主研发的全触屏互联网POS,一贯以领先的技术.快捷友好的用户体验和在全国广泛覆盖的网络,为电子商务.提供安全.可靠.保密的数据校验服务.作为其研发的一款专业移动开单扫描终端. 互联 ...

  3. WebApp触屏版网站开发要点

    所谓的触屏版网站其实也是WebApp的一种展示形式,主要是依赖HTML+CSS+Javascript这三个关键因素来实现,相比较原生客户端程序来说优点就是开发周期短.升级简单.维护成本低,因为从根本上 ...

  4. zTouch-移动端触屏开发利器(zepto touch扩展)

    * Zepto.js v1.0.1 touch extend (Zepto.js v1.0.1 的swipe touch扩展)js-处理手机移动端web触屏手势动作. Zepto.js v1.0.1版 ...

  5. WPF Multi-Touch 开发:高级触屏操作(Manipulation)

    原文 WPF Multi-Touch 开发:高级触屏操作(Manipulation) 在上一篇中我们对基础触控操作有了初步了解,本篇将继续介绍触碰控制的高级操作(Manipulation),在高级操作 ...

  6. WPF Multi-Touch 开发:基础触屏操作(Raw Touch)

    原文 WPF Multi-Touch 开发:基础触屏操作(Raw Touch) 多点触控(Multi-Touch)就是通过与触屏设备的接触达到人与应用程序交互的操作过程.例如,生活中经常使用的触屏手机 ...

  7. [Winform]关于cefsharp触屏设备长按文本内容,崩溃问题的修复

    摘要 在之前遇到cefsharp,在触屏电脑上,长按文本内容,会崩溃的问题. 相关文章 当时遇到这样的问题,在cefsharp项目下提交了bug.已经修复,可以参考当时我提的bug,以及解决过程,可参 ...

  8. 【Linux开发】【Qt开发】嵌入式Qt程序使用触屏或USB鼠标方式

    上文<嵌入式Qt开发-移植到ARM开发板 >介绍了Qt程序的移植,本文再说下如何使开发板Qt程序使用触摸屏或USB方式进行交互. 之前刚把一个qt程序移植到arm板上成功运行显示时就开心的 ...

  9. cefsharp + winform 内嵌网页的触屏输入焦点问题

    原文 现象 我正在使用 cefsharp + winform 建立一个桌面程序用于显示网页.但程序启动后触屏点击网页中的输入框,使用键盘输入,文字输入不进去.win + D 最小化程序后,再恢复窗口才 ...

  10. 移动终端学习2:触屏原生js事件及重力感应

    如今智能移动设备已经渗透到人们生活的方方面面,用户数量也在不断迅速增长(市场研究机构 eMarketer 在今年初发表的趋势报告中预测,2014年至2018年,中国智能手机用户从总人口的 38.3%增 ...

随机推荐

  1. 通过图片地址获取图片的base64,再通过base64获取二进制数据

    class Program { static void Main(string[] args) { string base64 = getFileBase64("D:\\Users\\Vat ...

  2. AsNoTracking()非跟踪数据 查询

    刚开始学习使用EF ,做项目时需要查询数据将数据显示在datagrid中,使用如下方法: query是IQueryable的 在一次看别人写的代码的时候,发现了AsNoTracking()这个方法,并 ...

  3. mac中virtualBox添加主机网络报错VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory

    mac中virtualBox添加主机网络报错 现场复原 解决方法 参考 mac中virtualBox添加主机网络报错 现场复原 virtual box添加主机网络报错 VBoxNetAdpCtl: E ...

  4. python自动化高效办公第二期,带你项目实战【二】{数据可视化、发送邮件(定时任务监控)、python聊天机器人(基于微信、钉钉)}

    相关文章和数据源: python自动化高效办公第二期,带你项目实战[一]{excel数据处理.批量化生成word模板.pdf和ppt等自动化操作} Python自动化办公--Pandas玩转Excel ...

  5. 推荐系统[三]:粗排算法常用模型汇总(集合选择和精准预估),技术发展历史(向量內积,Wide&Deep等模型)以及前沿技术

    1.前言:召回排序流程策略算法简介 推荐可分为以下四个流程,分别是召回.粗排.精排以及重排: 召回是源头,在某种意义上决定着整个推荐的天花板: 粗排是初筛,一般不会上复杂模型: 精排是整个推荐环节的重 ...

  6. C/C++ 监控磁盘与目录操作

    遍历磁盘容量: #include <stdio.h> #include <Windows.h> void GetDrivesType(const char* lpRootPat ...

  7. 【算法】priority_queue在力扣题中的应用 | 力扣692 | 力扣347 | 力扣295 【超详细的注释和算法解释】

    说在前面的话 博主也好长一段时间没有更新力扣的刷题系列了,今天给大家带来一些优先队列的经典题目,今天博主还是用C++给大家讲解,希望大家可以从中学到一些东西. 前言 那么这里博主先安利一下一些干货满满 ...

  8. Linux使用wget命令下载网络资源

    之前接触的Linux环境大多是内网,一般都是采用传统的FTP服务器统一存放常用资源,有人需要时从FTP直接下载,若公司FTP没有想要的资源,还需联系管理维护人员下载上传对应的介质. 而目前随着云ECS ...

  9. .NET 云原生架构师训练营(模块二 基础巩固 引入)--学习笔记

    2.1 引入 http协议 web server && web application framework .net 与 .net core asp .net core web api ...

  10. CF1829H Don't Blame Me

    题目链接 题解 知识点:线性dp,位运算. 考虑设 \(f_{i,j}\) 表示考虑了前 \(i\) 个数字,与和为 \(j\) 的方案数.转移方程显然. 注意初值为 \(f_{0,63} = 1\) ...