拦截WebView2中的TAB键

问题描述 投票:0回答:2

我想拦截Webview2里面的Tab键

通过我注册的

ICoreWebView2AcceleratorKeyPressedEventHandler
可以拦截很多功能键
add_AcceleratorKeyPressed

但是有些键如光标键和TAB键不会调用这个事件处理程序。 F5键也是一样的,缝起来有些键是保留的,奇怪的是position键up,down,pos1,end都可以被截取

因为 WebView2 本身的窗口位于另一个进程中,所以我没有机会使用标准子类化,我想避免使用钩子进行子类化。

c++ com microsoft-edge webview2
2个回答
3
投票

正如讨论中提到的,我解决了这个问题。

首先我在浏览器中注入了一个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()
);

比我添加一个

ICoreWebView2WebMessageReceivedEventHandler
add_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);

0
投票

另一种拦截击键的方法如下: https://github.com/MicrosoftEdge/WebView2Feedback/issues/1215

通过在 CoreWebView2EnvironmentOptions 上设置 AdditionalBrowserArguments("--enable-features=msWebView2BrowserHitTransparent") ,主机窗口可以接收关键消息以进行进一步处理。

© www.soinside.com 2019 - 2024. All rights reserved.