【问题标题】:WebView2 based ActiveX control and intercepting WM_LBUTTONDBLCLK基于 WebView2 的 ActiveX 控件和拦截 WM_LBUTTONDBLCLK
【发布时间】:2021-12-09 12:41:15
【问题描述】:

我有一个需要 WebView2 集成的旧版 VS2008 应用程序,旧版 IE 实现不再可行。为了实现这一点,我创建了一个 ActiveX 控件,它在 VS2019 中封装了 WebView2 API。父 VS2008 CDialog 通过 CreateControl() 支持网格中此 ActiveX 控件的多个实例。 InvokeHelper() 用于简单的 URL 和可见性命令。

所有工作和功能都符合预期。但是,我需要拦截双击鼠标消息以切换执行它的 ActiveX 控件的全屏。

问题是我似乎无法截获此消息。 ActiveX 控件似乎首先拦截了 WM_LBUTTONDBLCLK 消息并简单地将其关闭。

任何有关如何拦截此消息的建议将不胜感激。

【问题讨论】:

标签: visual-c++ mfc activex webview2


【解决方案1】:

以下基于 Poul 的建议构成了可接受的解决方案的基础。

  1. 来自您的 OnCreateCoreWebView2ControllerCompleted(...) 处理程序 添加 ICoreWebView2::AddSCriptToExecuteOnDocumentCreated(lpszJavacode,...)

  2. 以下 javascript 对我有用

    //  Individually 'click' and 'dblclick' handlers work, but together the
    //  'click' handler pre-dominates.  For this reason some timer based
    //  processing needs to be introduced.
    //  https://simplernerd.com/js-double-click/
    LPCTSTR lpszJavacode =
    L"let numClicks = 0;"
    L"const handleClick = () => {"
    L"    numClicks++;"
    L"    if (numClicks === 1) {"
    L"        singleClickTimer = setTimeout(() => {"
    L"            numClicks = 0;"
    L"            window.chrome.webview.postMessage('click');"
    L"        }, 400);"
    L"    } else if (numClicks === 2) {"
    L"        clearTimeout(singleClickTimer);"
    L"        numClicks = 0;"
    L"        window.chrome.webview.postMessage('dblclick');"
    L"    }"
    L"};"
    L"document.addEventListener('click', handleClick);";
    
  3. 为上述 javascript 产生结果时设置接收器 ICoreWebView2::add_WebMessageReceived ( ... )

  4. 在上面收到的回调中获取Json消息

    LPWSTR pwStr;
    args -> get_WebMessageAsJson( &pwStr );
    CString receivedMessage = pwStr
    

    然后在收到的网络消息中搜索“dblclick”和“click” receivedMessage.Find(L"dblclick") 和 (L"click")

  5. 将适当的 WM_LBUTTONDBLCLK 或 WM_LBUTTONUP 消息发送回 COleControl 派生的父级。这被假定为作为容器 WebView2 对象

  6. 收到 WM_LBUTTONDBLCLK 或 WM_LBUTTONUP 消息后触发 使用 COleControl::FireDblClick() 返回 ActiveX 容器和 FireClick()。

  7. 在 ActiveX 控件容器中创建一个 EVENTSINK_MAP 并添加处理程序 DISPID_CLICK 和 DISPIB_DBLCLK。 从这些容器中将 WM_LBUTTONDBLCLK 发送回消息循环。 WM__LBUTTONDOWN 和 WM_LBUTTONUP 已发布用于单击按钮。

  8. 解决方案对于传统的 MFC 程序员来说有些出乎意料,但有效 很好,已经打开了将 WebView2 集成到 VS2015 之前的大门 应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多