拦截WebView2中的TAB键
Intercept TAB Key in WebView2
我想拦截Webview2里面的Tab键
我在add_AcceleratorKeyPressed
注册的ICoreWebView2AcceleratorKeyPressedEventHandler
可以拦截很多功能键
但一些键如光标键和TAB 键不调用此事件处理程序。 F5键也一样,接缝有些键是保留的,奇怪因为位置键up,down,pos1,end可以被截取
因为 WebView2 本身的 window 位于另一个进程中,所以我没有机会使用标准子类化,我想避免使用钩子进行子类化。
正如讨论中提到的,我解决了这个问题。
首先我在浏览器中注入了一个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);
我想拦截Webview2里面的Tab键
我在add_AcceleratorKeyPressed
ICoreWebView2AcceleratorKeyPressedEventHandler
可以拦截很多功能键
但一些键如光标键和TAB 键不调用此事件处理程序。 F5键也一样,接缝有些键是保留的,奇怪因为位置键up,down,pos1,end可以被截取
因为 WebView2 本身的 window 位于另一个进程中,所以我没有机会使用标准子类化,我想避免使用钩子进行子类化。
正如讨论中提到的,我解决了这个问题。
首先我在浏览器中注入了一个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);