WebView2 - 通过弹出窗口中的上下文菜单查看页面源代码 window

WebView2 - Viewing Page Source via Context Menu in popup window

我知道有几个关于页面源主题的问题,但它们似乎与我的问题无关。我也在 WebView2 GitHub 网站上问过这个问题,但它被关闭了。

目标

我的 CDialog 上有一个嵌入式 WebView2 控件,我正在实现一个自定义菜单。我希望能够查看页面源代码,它应该显示在弹出窗口中。事实上,它应该与您在浏览器控件中按 CTRL + U 时的显示完全相同:

问题

我添加了以下自定义菜单事件处理程序来显示页面源代码:

// ===============================================================
wil::com_ptr<ICoreWebView2ContextMenuItem> itemViewPageSource;
CHECK_FAILURE(webviewEnvironment->CreateContextMenuItem(
    L"View Page Source (CTRL + U)", nullptr,
    COREWEBVIEW2_CONTEXT_MENU_ITEM_KIND_COMMAND, &itemViewPageSource));

CHECK_FAILURE(itemViewPageSource->add_CustomItemSelected(
    Callback<ICoreWebView2CustomItemSelectedEventHandler>(
        [appWindow = this, target](ICoreWebView2ContextMenuItem* sender, IUnknown* args)
        {
            wil::unique_cotaskmem_string pageUri;
            CHECK_FAILURE(target->get_PageUri(&pageUri));
            CString strUrl = L"view-source:" + CString(pageUri.get());

            appWindow->NavigateTo(strUrl);
            //appWindow->m_pImpl->m_webView->ExecuteScript(L"window.open(\"" + CString(pageUri.get()) + L"\", \"\", \"width=300, height=300\")", nullptr);

            return S_OK;
        })
    .Get(), nullptr));

CHECK_FAILURE(items->InsertValueAtIndex(itemsCount, itemViewPageSource.get()));
itemsCount++;
// ===============================================================

问题是源没有显示在新的弹出窗口中window(就像使用热键时一样):

更新 1

我能够更改代码以使用一些 JavaScript 在新的 window 中显示页面本身:

 appWindow->m_pImpl->m_webView->ExecuteScript(L"window.open(\"" + CString(pageUri.get()) + L"\", \"\", \"width=300, height=300\")", nullptr);

然后,当我在弹出窗口 window 上尝试 CTRL + U 时,它似乎在同一个 window 中显示源代码。但实际上它是一个新的 window,因为我可以移动它:

此时我还没有找到如何在弹出窗口中显示页面源代码 window(考虑到我的浏览器控件的上下文)就像您按 CTRL + U 时一样。

最简单的方法就是为什么 SendInput API:

CHECK_FAILURE(itemViewPageSource->add_CustomItemSelected(
    Callback<ICoreWebView2CustomItemSelectedEventHandler>(
        [appWindow = this, target](ICoreWebView2ContextMenuItem* sender, IUnknown* args)
        {
            wil::unique_cotaskmem_string pageUri;
            CHECK_FAILURE(target->get_PageUri(&pageUri));
            CString strUrl = L"view-source:" + CString(pageUri.get());

            // Create an array of generic keyboard INPUT structures
            INPUT ip[4] = {};
            for (int n = 0; n < 4; ++n)
            {
                ip[n].type = INPUT_KEYBOARD;
                ip[n].ki.wScan = 0;
                ip[n].ki.time = 0;
                ip[n].ki.dwFlags = 0; // 0 for key press
                ip[n].ki.dwExtraInfo = 0;
            }

            ip[0].ki.wVk = VK_CONTROL;
            ip[1].ki.wVk = 'U';

            ip[2].ki.wVk = 'U';
            ip[2].ki.dwFlags = KEYEVENTF_KEYUP;

            ip[3].ki.wVk = VK_CONTROL;
            ip[3].ki.dwFlags = KEYEVENTF_KEYUP;

            SendInput(4, ip, sizeof(INPUT));
            
            return S_OK;
        })
    .Get(), nullptr));

CHECK_FAILURE(items->InsertValueAtIndex(itemsCount, itemViewPageSource.get()));
itemsCount++;