c++ 截取WebView2中的TAB键

vh0rcniy  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(291)

我想拦截Webview2中的Tab键。
通过我注册到add_AcceleratorKeyPressedICoreWebView2AcceleratorKeyPressedEventHandler可以截获很多功能键
但是某些键(如光标键和TAB键)不调用此事件处理程序。F5键也是一样,似乎有些键是保留的,奇怪的是,位置键up,down,pos1,end可以被拦截。
因为WebView2的窗口本身位于另一个进程中,所以我没有机会使用标准的子类化,我想避免使用钩子进行子类化。

ghg1uchk

ghg1uchk1#

正如在讨论中提到的,我解决了这个问题。
首先,我将一个Java脚本注入浏览器

m_spWebView->AddScriptToExecuteOnDocumentCreated(
    L"window.document.addEventListener('keydown', function(e) {\n"
    L" if (e.keyCode===9 || e.keyCode===13) {\n"
    L"  window.chrome.webview.postMessage('" CHAR_TOKEN L"'+e.keyCode.toString()); \n"
    L"  e.preventDefault(); \n"
    L"}});\n"
    ,Callback<ICoreWebView2AddScriptToExecuteOnDocumentCreatedCompletedHandler>(this,&CBrowserWV2Wnd::OnAddScriptToExecuteOnDocumentCreated).Get()
);

然后我添加了一个ICoreWebView2WebMessageReceivedEventHandleradd_WebMessageReceived来处理来自托管WebView2的适当消息。

LPWSTR pwStr = nullptr;
args->TryGetWebMessageAsString(&pwStr);
if (_wcsnicmp(pwStr,CHAR_TOKEN,MfxCountOf(CHAR_TOKEN)-1)==0)
{
    // Get the Keycode from the message
    auto iChar = wcstol(pwStr+MfxCountOf(CHAR_TOKEN)-1,nullptr,10);
    // Do something with the intercepted character
    ...
}
::CoTaskMemFree(pwStr);
jhdbpxl9

jhdbpxl92#

拦截击键的另一种方法如下:https://github.com/MicrosoftEdge/WebView2Feedback/issues/1215
通过在CoreWebView2EnvironmentOptions上设置AdditionalBrowserArguments("--enable-features=msWebView2BrowserHitTransparent"),主机窗口可以接收关键消息以进行进一步处理。

相关问题