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++;
我知道有几个关于页面源主题的问题,但它们似乎与我的问题无关。我也在 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++;