• 全局键盘钩子失效与WebRTC的关系分析


    1.背景:

    使用QT+CEF做了一个客户端,并在客户端中注册了全局键盘钩子,本来一切都工作正常,键盘钩子也正常,但是我发现当我在cef中加载了执行WebRTC功能的页面时,

    键盘钩子尽然失效了,不过切换到其他的桌面程序的时候,发现这个键盘钩子还是存在的,起作用的。

    2.分析

    通过上面的现象开始排查,WebRTC主要是用到摄像头和麦克风功能;通过单独的测试,如果只打开摄像头的话,键盘钩子依旧有效,那问题的根源就在于当网页中使用了麦克风时,会导致键盘钩子失效。

    首先想到的是到CEF Forum上查找,起初不知道该怎么描述这种现象,不确定是否有其他人遇到这种应用场景很小的问题,不过通过仔细查找,最终也是找到了一个帖子,所描述的现象与现在存在的问题一致。

    通过查看帖子,发现原来是Chromium内核中使用的某个特性:在使用Audio的使用,为了对键盘敲击所产生的噪音进行处理,WebRTC模块也注册了自己的全局键盘钩子,导致当CEF加载一个具有使用Audio的页面时,会导致本来存在的键盘钩子失效。(具体原因就是Windows规定,注册的低级别键盘钩子只针对Application级别,如果一个Application的不同Window注册低级别键盘钩子,后注册的会起作用,二先注册的会失效,也就是只有后注册的才能接受消息)。

    对Chromium源码分析:

    追踪到关键类型:UserInputMonitor类,这个类决定是否对用户键盘输入Monitor,目前Chromium也没有提供单独的控制参数来关闭这个Monitor,所以暂时无解。

    3.解决办法

    既然不能同时在一个Application中拥有两个一样的键盘钩子,所以只能将自己的键盘钩子放到其他的程序里,作为一个辅助程序来调用。然后通过进程间通讯来实现其他业务逻辑。

    4.链接

    forum讨论:https://bitbucket.org/chromiumembedded/cef/issues/2609/chomium-windows-when-using-own-low-level

    源码:https://source.chromium.org/chromium/chromium/src/+/master:media/base/user_input_monitor_win.cc;l=95;bpv=1;bpt=1

  • 相关阅读:
    NTP时钟服务器(卫星授时)技术让网络时间同步不再难
    视频监控系统为何需要GPS北斗授时服务器?
    如何选购GPS北斗卫星时钟同步装置?市场均价多少?
    Orange'S学习笔记(一)
    Oracle 11g中文版高清视频教程
    新书推荐:Orange'S:一个操作系统的实现
    引导扇区汇编代码解释
    灰度图转伪彩色图代码
    Visual Odometry For GPSDenied Flight And Mapping Using A Kinect
    [原创]日行一善,命运在不知不觉中改变
  • 原文地址:https://www.cnblogs.com/chyshx/p/14478601.html
Copyright © 2020-2023  润新知