【问题标题】:Intercepting Windows Messages from Webview2 (Edge/Chromium)从 Webview2 (Edge/Chromium) 拦截 Windows 消息
【发布时间】:2020-12-02 14:29:18
【问题描述】:

我最近将我的一个项目迁移到WebView2,我不知道的最后一部分是如何拦截 webview 的 Windows 消息。我的代码与webview/webview 非常相似,但我无法在他们的 GitHub 上找到帮助。

以前,我能够找到 webview 的 hWnd 并使用 SetWindowSubclass 将我自己的 wndproc 添加到 webview。但是,我已经使用了Spy++ 并在所有出现在那里的窗口上尝试了SetWindowSubclass(见下文),但除了一些我认为没有的窗口管理消息之外,我的wndproc 中没有任何窗口消息有用 - 我得到的最好的是 WM_PARENTYNOTIFY,但我对 WM_MOUSEMOVEWM_NCHITTEST 感兴趣 - 我都找不到。

我的目标是创建一个基于 WebView2 的无边框、可拖动、可调整大小的应用程序。

【问题讨论】:

  • 为什么? WebView2 允许您为感兴趣的事件注册代表。您真正想在这里解决什么问题
  • @IInspectable 例如,无法为WM_NCHITTEST 注册事件。我正在尝试实现可拖动和可调整大小的无边界 Webview2。我用以前的 Webview 以这种方式工作,但现在我正在尝试迁移到 Webview2
  • 您可能应该将一些 javascript 注入到您正在查看的页面中,然后您可以在 javascript 中编写事件处理程序并使用 window.chrome.webview2.postmessage 向您的 C++ 代码报告。
  • @PoulBak 我可以这样做来拖动窗口,但如果我尝试这样做以调整大小并发送 WM_NCHITTEST,光标将在 webview 尝试发送的内容和我尝试发送的内容之间闪烁发送
  • 在我之前的 webview1 框架中,我通过捕获而不是传播某些消息来解决这个问题。

标签: c++ winapi webview wndproc webview2


【解决方案1】:

问题是,控制和获取所有这些输入的真实窗口位于另一个进程中。您只会看到一个窗口,其中显示了您的流程中的输出。

调查 Spy++。 Chrome_WidgetWin_0 下面的所有内容都属于一个新进程 (MSEDGEWEBVIEW2),并且不属于您的进程。所以你不能用普通技术子类化这样的窗口。

所以如果你想子类这个窗口。您需要在这个新进程中注入一个新的 DLL。这个 DLL 可能是真实窗口的子类。而这个 DLL 可能会通过任何 IPC 与您的托管程序进行通信。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-22
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2012-03-17
    相关资源
    最近更新 更多