原文

现象

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

临时措施

  1. //在 form loaded 事件里设置焦点
  2. ChromiumWebBrowser.GetBrowser().GetHost().SetFocus(true);

又出现新问题

程序在使用过程中,偶尔又会出现输入不进去的问题,win + D 最小化程序后,再恢复窗口才能正常输入。

可能因为什么操作又丢失了焦点。但 ChromiumWebBrowser.GetBrowser().GetHost() 没有失去焦点事件,找不到好的事机再次使用临时措施(SetFocus)。

Google 了一圈找到几个方案。

方案一 FocusHandler(无效)

browser.FocusHandler 属性设置为 null

对于我的问题无效。没有解决

方案二 关闭多线程消息循环(有效

这个方法对于我的问题有效,即使我不使用临时措施设置 SetFocus ,输入也一切正常。我猜测那个偶发的新问题应该也不会再出现,待后续观察!

而在官方论坛中这个 bug 被标记为不修复 ,所以即使升级版本也没用,有同样问题的同学可以试试这个方法。

Program.cs/Main 内

  1. CefSettings settings = new CefSettings();
  2. settings.CefCommandLineArgs["multi-threaded-message-loop"] = "0";
  3. settings.MultiThreadedMessageLoop = false;
  4. Cef.Initialize(settings);
  5. Application.Idle += Application_Idle;
  6. //Application_Idle
  7. private static void Application_Idle(object sender, EventArgs e)
  8. {
  9. Cef.DoMessageLoopWork();
  10. }

方案三 升级内核版本(无效)

Cefsharp - keyboard not working until refocus

答案里提到这个问题已经在 version 81 中修复。我目前使用的是 73 版本。

于是升级到 81.3.10 版本。观察使用了几天,依旧出现偶尔输入不进去的问题

方案四 设置主程序的 ExStyle(无效)

继承 ChromiumWebBrowser 重写

  1. public class MyWebBrowser : ChromiumWebBrowser
  2. {
  3. public MyWebBrowser(string address, IRequestContext requestContext = null) : base(address, requestContext)
  4. {
  5. }
  6. const uint WS_EX_NOACTIVATE = 0x08000000;
  7. protected override IWindowInfo CreateBrowserWindowInfo(IntPtr handle)
  8. {
  9. var info = base.CreateBrowserWindowInfo(handle);
  10. info.ExStyle &= WS_EX_NOACTIVATE;
  11. return info;
  12. }
  13. }

方案五 提取屏幕键盘(无效)

之前屏幕键盘是一个control,在主程序的form中显示,现在提取成一个单独项目编译成 exe。设置键盘的窗口不抢焦点,就像输入法界面那样

但已验证该方案没有效果,但我也保留这个修改,作为键盘的功能优化。

  1. public partial class KeyboardForm : Form
  2. {
  3. public KeyboardForm()
  4. {
  5. InitializeComponent();
  6. }
  7. private const int WS_EX_TOOLWINDOW = 0x00000080;
  8. private const int WS_EX_NOACTIVATE = 0x08000000;
  9. protected override CreateParams CreateParams
  10. {
  11. get
  12. {
  13. const int WS_CHILD = 0x40000000;
  14. CreateParams cp = base.CreateParams;
  15. cp.ExStyle |= (WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW);
  16. return cp;
  17. }
  18. }
  19. }

cefsharp + winform 内嵌网页的触屏输入焦点问题的更多相关文章

  1. Unity中内嵌网页插件UniWebView使用总结

    目前有三种方式可以实现在Unity工程中实现内嵌网页的功能: 1.  UnityWebCore:只支持Windows平台,调用浏览器内核,将网页渲染到mesh,作为gameObject. 2.  Un ...

  2. WPF应用程序内嵌网页

    原文:WPF应用程序内嵌网页 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/shaynerain/article/details/78160984 WPF ...

  3. WPF内嵌网页的两种方式

    在wpf程序中,有时会内嵌网页.内嵌网页有两种方法,一种是使用wpf自带WebBrowser控件来调用IE内核,另一种是使用CefSharp包来调用chrom内核. 一.第一种使用自带WebBrows ...

  4. 关于Unity程序在IOS和Android上显示内嵌网页的方式

    近期因为有须要在Unity程序执行在ios或android手机上显示内嵌网页.所以遍从网上搜集了一下相关的资料.整理例如以下: UnityWebCore 从搜索中先看到了这个.下载下来了以后发现这个的 ...

  5. iOS 之 内嵌网页

    现在iOS 有两种内嵌网页的技术,一种是UIWebView,而另一种WKWebView则是iOS8之后出现的技术. iOS 之 UIWebView WKWebView

  6. [小程序开发] 微信小程序内嵌网页web-view开发教程

    为了便于开发者灵活配置小程序,微信小程序开放了内嵌网页能力.这意味着小程序的内容不再局限于pages和large,我们可以借助内嵌网页丰富小程序的内容.下面附上详细的开发教程(含视频操作以及注意事项) ...

  7. 微信小程序内嵌网页能力开放 小程序支持内嵌网页文档说明

    为了方便开发者灵活配置微信小程序,张小龙现在开放了小程序的内嵌网页功能,这是一个非常大的惊喜啊,以后意味着你只要开放一个手机端网站,就可以制作一个小程序了哦.操作方法1.开发者登录微信小程序后台,选择 ...

  8. Unity中内嵌网页插件UniWebView

    一.常见Unity中内嵌网页实现方式: 1.UnityWebCore只支持windows 2.Unity-Webview支持Android,IOS 3.UniWebView支持mac os,Andro ...

  9. Unity 内嵌网页

    uniwebview 官网 http://uniwebview.onevcat.com/reference/class_uni_web_view.html http://uniwebview.onev ...

随机推荐

  1. C++ | 动多态的发生时机

    探究动多态的发生时机 有了虚函数和虚函数表为动多态提供支持,从而可以实现C++语言的动多态.那么,问题又来了. 动多态的发生时机是什么? 或者说,动多态发生有哪些条件与限制呢? 下面让我们一起来探究动 ...

  2. 简单vue项目脚手架

    简单vue项目脚手架 github地址 使用技术栈 webpack(^2.6.1) webpack-dev-server(^2.4.5) vue(^2.3.3) vuex(^2.3.1) vue-ro ...

  3. h5 ios输入框与键盘 兼容性优化

    起因 h5的输入框引起键盘导致体验不好,目前就算微信.知乎.百度等产品也没有很好的技术方案实现,尤其底部固定位置的输入框各种方案都用的前提下体验也并没有很好,这个问题也是老大难问题了.目前在准备一套与 ...

  4. snippet,让你编码效率翻倍

    为什么谈到Snippet 今天下午在用vscode做小程序的时候,发现很不方便,因为商店里提供的代码片段极为有限,而且平时几乎每天都需要用到代码片段,所以就在思考他们是怎么做到给别人提供代码的,我可以 ...

  5. java中如何能知道应该捕获什么样的异常?举例

    我怎么知道应该捕获什么样的异常? 马克-to-win:如上例1.1:开始没加try时,程序崩溃,系统打印的是如下的错误,Exception in thread "main" jav ...

  6. spring security简介与使用

    目录 spring security 新建一个springboot项目 添加spring security 登录 使用默认用户和随机生成的密码登录 使用yaml文件定义的用户名.密码登录 使用代码中指 ...

  7. css如何实现图片响应式等比例缩放,裁剪

    <div class="bg_picWrapper"  :style="{backgroundImage:'url('+img+')'}">---- ...

  8. c++对c的拓展_编译检测的增强

    一:全局变量检测增强:c++编译对全局变量的声明定义有严格区别 //c中全局变量的声明及定义         //c++中全局变量的声明及定义        //c++全局变量写成下列形式则报错 in ...

  9. 解决一次calico异常情况,pod之间访问pod ip不通

    k8s 集群采用二进制安装,cni网络插件用calico通讯问题描述:发现有些pod不是很正常例如: ht13.node正常系统采样 [root@ht6 ~]# cat /etc/redhat-rel ...

  10. MySql各版本

    Mysql 各个版本区别: 1.MySQL Community Server 社区版本,开源免费,但不提供官方技术支持. 2.MySQL Enterprise Edition 企业版本,需付费,可以试 ...