cefsharp + winform 内嵌网页的触屏输入焦点问题
现象
我正在使用 cefsharp + winform 建立一个桌面程序用于显示网页。但程序启动后触屏点击网页中的输入框,使用键盘输入,文字输入不进去。win + D 最小化程序后,再恢复窗口才能正常输入。
临时措施
//在 form loaded 事件里设置焦点
ChromiumWebBrowser.GetBrowser().GetHost().SetFocus(true);
又出现新问题
程序在使用过程中,偶尔又会出现输入不进去的问题,win + D 最小化程序后,再恢复窗口才能正常输入。
可能因为什么操作又丢失了焦点。但 ChromiumWebBrowser.GetBrowser().GetHost() 没有失去焦点事件,找不到好的事机再次使用临时措施(SetFocus)。
Google 了一圈找到几个方案。
方案一 FocusHandler(无效)
将 browser.FocusHandler 属性设置为 null
对于我的问题无效。没有解决
方案二 关闭多线程消息循环(有效)
这个方法对于我的问题有效,即使我不使用临时措施设置 SetFocus ,输入也一切正常。我猜测那个偶发的新问题应该也不会再出现,待后续观察!
而在官方论坛中这个 bug 被标记为不修复 ,所以即使升级版本也没用,有同样问题的同学可以试试这个方法。
Program.cs/Main 内
CefSettings settings = new CefSettings();
settings.CefCommandLineArgs["multi-threaded-message-loop"] = "0";
settings.MultiThreadedMessageLoop = false;
Cef.Initialize(settings);
Application.Idle += Application_Idle;
//Application_Idle
private static void Application_Idle(object sender, EventArgs e)
{
Cef.DoMessageLoopWork();
}
方案三 升级内核版本(无效)
Cefsharp - keyboard not working until refocus
答案里提到这个问题已经在 version 81 中修复。我目前使用的是 73 版本。
于是升级到 81.3.10 版本。观察使用了几天,依旧出现偶尔输入不进去的问题
方案四 设置主程序的 ExStyle(无效)
继承 ChromiumWebBrowser 重写
public class MyWebBrowser : ChromiumWebBrowser
{
public MyWebBrowser(string address, IRequestContext requestContext = null) : base(address, requestContext)
{
}
const uint WS_EX_NOACTIVATE = 0x08000000;
protected override IWindowInfo CreateBrowserWindowInfo(IntPtr handle)
{
var info = base.CreateBrowserWindowInfo(handle);
info.ExStyle &= WS_EX_NOACTIVATE;
return info;
}
}
方案五 提取屏幕键盘(无效)
之前屏幕键盘是一个control,在主程序的form中显示,现在提取成一个单独项目编译成 exe。设置键盘的窗口不抢焦点,就像输入法界面那样
但已验证该方案没有效果,但我也保留这个修改,作为键盘的功能优化。
public partial class KeyboardForm : Form
{
public KeyboardForm()
{
InitializeComponent();
}
private const int WS_EX_TOOLWINDOW = 0x00000080;
private const int WS_EX_NOACTIVATE = 0x08000000;
protected override CreateParams CreateParams
{
get
{
const int WS_CHILD = 0x40000000;
CreateParams cp = base.CreateParams;
cp.ExStyle |= (WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW);
return cp;
}
}
}
cefsharp + winform 内嵌网页的触屏输入焦点问题的更多相关文章
- Unity中内嵌网页插件UniWebView使用总结
目前有三种方式可以实现在Unity工程中实现内嵌网页的功能: 1. UnityWebCore:只支持Windows平台,调用浏览器内核,将网页渲染到mesh,作为gameObject. 2. Un ...
- WPF应用程序内嵌网页
原文:WPF应用程序内嵌网页 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/shaynerain/article/details/78160984 WPF ...
- WPF内嵌网页的两种方式
在wpf程序中,有时会内嵌网页.内嵌网页有两种方法,一种是使用wpf自带WebBrowser控件来调用IE内核,另一种是使用CefSharp包来调用chrom内核. 一.第一种使用自带WebBrows ...
- 关于Unity程序在IOS和Android上显示内嵌网页的方式
近期因为有须要在Unity程序执行在ios或android手机上显示内嵌网页.所以遍从网上搜集了一下相关的资料.整理例如以下: UnityWebCore 从搜索中先看到了这个.下载下来了以后发现这个的 ...
- iOS 之 内嵌网页
现在iOS 有两种内嵌网页的技术,一种是UIWebView,而另一种WKWebView则是iOS8之后出现的技术. iOS 之 UIWebView WKWebView
- [小程序开发] 微信小程序内嵌网页web-view开发教程
为了便于开发者灵活配置小程序,微信小程序开放了内嵌网页能力.这意味着小程序的内容不再局限于pages和large,我们可以借助内嵌网页丰富小程序的内容.下面附上详细的开发教程(含视频操作以及注意事项) ...
- 微信小程序内嵌网页能力开放 小程序支持内嵌网页文档说明
为了方便开发者灵活配置微信小程序,张小龙现在开放了小程序的内嵌网页功能,这是一个非常大的惊喜啊,以后意味着你只要开放一个手机端网站,就可以制作一个小程序了哦.操作方法1.开发者登录微信小程序后台,选择 ...
- Unity中内嵌网页插件UniWebView
一.常见Unity中内嵌网页实现方式: 1.UnityWebCore只支持windows 2.Unity-Webview支持Android,IOS 3.UniWebView支持mac os,Andro ...
- Unity 内嵌网页
uniwebview 官网 http://uniwebview.onevcat.com/reference/class_uni_web_view.html http://uniwebview.onev ...
随机推荐
- 可想实现一个自己的简单jQuery库?(九)
Lesson-8 事件机制 在讲事件机制之前呢,我们有一个很重要的东西要先讲,那就是如何实现事件委托(代理). 只有必须先明白了如何实现一个事件委托,我们才能更好的去实现on和off.在我看来,on和 ...
- 使用 Blueprint 要注意 render_template 函数
此文章主要是为了记录在使用 Flask 的过程中遇到的问题.本章主要讨论 render_template 函数的问题. 使用 Flask 的同学都应该知道,项目中的 url 和视图函数是在字典里一一对 ...
- 我的python学习记_03
数据类型 python中的数据类型包括:1.数字类型number:整型int(即整数) 浮点型float(小数形式,整数的话后面加".0") 布尔型(判断正确与否) 复数型(com ...
- onActivityResult执行两次问题
差点被坑死 记一次onActivityResult被调用两次的坑
- jsp+servlet上传excel并将数据导入到数据库表的实现方法
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- Hibernate快速上手
一. Hibernate介绍 1. Hibernate简介 Hibernate是一个开放源码的对象-关系映射(ORM)框架,他对JDBC进行了轻量级封装,开发人员可以使用面向对象的编程思想来进行持久层 ...
- HashMap和ConcurrentHashMap的原理和实现
一.线程不安全的HashMap 多线程环境下,使用HashMap进行put操作会引起死循环(jdk1.7 Entry链表形成环形数据结构),导致CPU利用率接近100%. 结构:数组 table[]+ ...
- Blazor组件自做八 : 使用JS隔离封装屏幕键盘kioskboard.js组件
1. 运行截图 演示地址 2. 在文件夹wwwroot/lib,添加kioskboard子文件夹,添加kioskboards.js文件 2.1 常规操作,懒加载js库, export function ...
- 想减少代码量,快设置一个有感知的 Aware Spring Bean
摘要:正常情况下,Spring 中的 Bean 对 Spring 是无感知的,Spring 框架提供了这种扩展能力,能让一个 bean 成为有感知的. 本文分享自华为云社区<有感知的 Aware ...
- STL空间分配器源码分析(一)
一.摘要 STL的空间分配器(allocator)定义于命名空间std内,主要为STL容器提供内存的分配和释放.对象的构造和析构的统一管理.空间分配器的实现细节,对于容器来说完全透明,容器不需关注内存 ...