CEF3 系列 -- 实践汇总(持续更新)

前言

首次半年绩效考核,挺好的绩效。输出一些技术相关的汇总, 比如:Cef。

  • 20 年 7 月,应届入职。博主首次接触 Web 相关开发:Electron & VueJS 桌面客户端。
  • 22 年 11 月,博主入职新公司,并再次接触 Web 相关的开发:Qt & QCefView 桌面客户端。

正文

汇总主要关注应用开发中的技术问题、技术 ‘难点’ 。因此,后续部分将以列表形式给出。

1、Input Method Editor (IME)

详见 [杂项] CEF3 -- IME Behavior

2、QCefView 输入法组合键:小语种(葡萄牙语)

KeyBoardUtils 作为插件的辅助工具,主要用于 Qt 事件 –> CEF3 事件的参数转换。其中的 winGetKeyBoardModifiers 接口,负责解析虚拟组合按键。

  • 问题代码段
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    static uint32_t
    winGetKeyboardModifiers(QKeyEvent* qe){
    ...
    if(!qe->text().isEmpty() && (::GetKeyState(VK_RMENU) & 0x8000)){
    HKL current_layout = ::GetKeyBoardLayout(0);
    SHORT scan_res = ::VkKeyScanExW(vk, current_layout);
    if(((scan_res >> 8) & 0xFF) == (2 | 4)){
    cm &= ~(EVENTFLAG_CONTROL_DOWN | EVENTFLAG_ALT_DOWN);
    cm |= EVENTFLAG_ALTGR_DOWN
    }
    }
    return cm;
    }
    首先,从代码风格可见 QCefView 作者具备深厚的 Window 开发功底。问题代码意图:
    • 判断小语种键盘:::GetKeyState(VK_RMENU) & 0x8000
    • 获取键盘布局:::GetKeyBoardLayout(0)
    • 通过 VirtualKey 和 物理键盘布局获取扫描码:VkKeyScanExW(vk, current_layout)
    • 匹配 Control + ALT 组合键:位运算见上述代码。
  • 修复代码段
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    static uint32_t
    winGetKeyboardModifiers(QKeyEvent* qe){
    ...
    if(!qe->text().isEmpty()){
    if((m & Qt::ControlModifier) && (m & Qt::ALtModifier)){
    cm &= ~(EVENTFLAG_CONTROL_DOWN | EVENTFLAG_ALT_DOWN);
    cm |= EVENTFLAG_ALTGR_DOWN
    }
    }
    return cm;
    }
    OSR 渲染模式下,我们无法获取正确的窗口句柄及其 Window 消息。所以,上述操作有点多此一举:只需要匹配 CONTROL + ALT 即可。

3、QCefView Hover Event: HoverIn & HoverOut

CEF3 三种鼠标事件 :cef_browser_capi

  • send_mouse_click_event: 处理鼠标点击
  • send_mouse_move_event:处理鼠标移动
  • send_mouse_wheel_event:处理鼠标滚轮

Qt 鼠标事件

  • mouseMoveEvent: 鼠标移动
  • mousePressEvent:鼠标按下
  • mouseReleaseEvent:鼠标释放
  • wheelEvent:鼠标滚轮
  • enterEvent & leaveEvent: 鼠标移入 & 移出

问题描述
QCefView 插件完美适配了 Qt 的前四种事件,即:mouseMove、mousePress、mouseRelease、wheelEvent。通过字面义,可以很清晰地将 CEF3 和 QCefView 事件映射。 然而,enterEventleaveEvent 并没有找到合适的选择。当窗口边缘属于可滚动区域时,边缘的滚动条的交互效果会出现 Bug: 缺少 HoverIn、HoverOut 效果。
问题解决
通过测试,CEF3 的 send_mouse_move_event 接口兼具 moveMouse、mouseEnter 和 mouseLeave 的功能。因此,只需要按照 QCefView 接口规范,补充并转发 Qt 对应的 enterEventleaveEvent 即可。


CEF3 系列 -- 实践汇总(持续更新)
https://jalencui.com/2023/09/02/CEF-Pratice-Summary/
Author
Jalen Cui
Posted on
September 2, 2023
Licensed under