WebView2 当前可以接收键盘输入吗
Can WebView2 currently receive Keyboard inputs
我正在尝试在 WPF 中创建一个软件,它承载一个浏览器(WebView2 当前为 1.0.818.41),并且当浏览器中有一个输入字段时显示一个 OnScreenKeyboard。
我以前在 WPF 中用 CefSharp 做过这种事情,但我目前不能用 WebView2 做。我的问题是我找不到将击键从 OnScreenKeyboard(或从 WPF Window)发送到浏览器的方法。
在 CefSharp 中,我们有一个名为 ChromiumWebBrowser.GetHost().SendKeyEvent() 的函数,但我在 WebView2 中找不到类似的东西。
我是瞎了眼还是目前还没有实现(或者可能没有计划)?
提前致谢!
没有直接的方法。可以做的是执行一些 JS,然后将消息发布到 WebView。然后可以在 wv2_WebMessageReceived
事件中捕获此消息。
关于互操作 between.NET 和 JS 以及 JS 和 .NET WPF 表单之间的互操作的大量文档 here。
一个解决方案是在 NavigationStarting
事件中注入一个 sendMessage
JS 函数:
private void wv2_NavigationStarting(Microsoft.UI.Xaml.Controls.WebView2 sender, Microsoft.Web.WebView2.Core.CoreWebView2NavigationStartingEventArgs args){
var sc = "function sendMessage(txt) { window.chrome.webview.postMessage(txt); }";
wv2.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(sc);
}
现在您收集输入字段并向这些输入字段添加 onfocus
和 onblur
事件,例如在 NavigationCompleted
事件中,如下所示:
private void wv2_NavigationCompleted(Microsoft.UI.Xaml.Controls.WebView2 sender, Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs args){
string script = "const collection ="+
"document.getElementsByTagName(\"input\");" +
"for (let i = 0; i < collection.length; i++){" +
"collection[i].onfocus= ()=>{ sendMessage('onFocus('+collection[i].name')'); }; " +
"collection[i].onblur= (ev)=>{ sendMessage('onBlur('+collection[i].name')'); };"+
"}";
sender.ExecuteScriptAsync(script);
}
现在在 wv2_WebMessageReceived
事件中捕获消息:
private void wv2_WebMessageReceived(Microsoft.UI.Xaml.Controls.WebView2 sender, Microsoft.Web.WebView2.Core.CoreWebView2WebMessageReceivedEventArgs args)
{
var postMess = args.TryGetWebMessageAsString();
if (postMess == "onFocus(nameOfField)" )
{
// here activate the button(keyboard)
// store the Name on focusField variable
}
if (postMess == "onBlur" && paneShown)
{
// here deactivate the button(keyboard)
// release the focusField
}
}
现在您可以向输入字段发送点击事件:
private void btn_Clicked(Object sender, EventArgs args)
{
var script = "var field "+
"= document.getElementsByName("+focusField+");" +
" field.value+=field.value"+args.keyValue();
wv2.CoreWebView2.ExecuteScriptAsync(script);
}
wv2
是WebView2
的一个实例,这里直接敲代码,没有编译。希望你明白了。
我正在尝试在 WPF 中创建一个软件,它承载一个浏览器(WebView2 当前为 1.0.818.41),并且当浏览器中有一个输入字段时显示一个 OnScreenKeyboard。
我以前在 WPF 中用 CefSharp 做过这种事情,但我目前不能用 WebView2 做。我的问题是我找不到将击键从 OnScreenKeyboard(或从 WPF Window)发送到浏览器的方法。
在 CefSharp 中,我们有一个名为 ChromiumWebBrowser.GetHost().SendKeyEvent() 的函数,但我在 WebView2 中找不到类似的东西。
我是瞎了眼还是目前还没有实现(或者可能没有计划)?
提前致谢!
没有直接的方法。可以做的是执行一些 JS,然后将消息发布到 WebView。然后可以在 wv2_WebMessageReceived
事件中捕获此消息。
关于互操作 between.NET 和 JS 以及 JS 和 .NET WPF 表单之间的互操作的大量文档 here。
一个解决方案是在 NavigationStarting
事件中注入一个 sendMessage
JS 函数:
private void wv2_NavigationStarting(Microsoft.UI.Xaml.Controls.WebView2 sender, Microsoft.Web.WebView2.Core.CoreWebView2NavigationStartingEventArgs args){
var sc = "function sendMessage(txt) { window.chrome.webview.postMessage(txt); }";
wv2.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(sc);
}
现在您收集输入字段并向这些输入字段添加 onfocus
和 onblur
事件,例如在 NavigationCompleted
事件中,如下所示:
private void wv2_NavigationCompleted(Microsoft.UI.Xaml.Controls.WebView2 sender, Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs args){
string script = "const collection ="+
"document.getElementsByTagName(\"input\");" +
"for (let i = 0; i < collection.length; i++){" +
"collection[i].onfocus= ()=>{ sendMessage('onFocus('+collection[i].name')'); }; " +
"collection[i].onblur= (ev)=>{ sendMessage('onBlur('+collection[i].name')'); };"+
"}";
sender.ExecuteScriptAsync(script);
}
现在在 wv2_WebMessageReceived
事件中捕获消息:
private void wv2_WebMessageReceived(Microsoft.UI.Xaml.Controls.WebView2 sender, Microsoft.Web.WebView2.Core.CoreWebView2WebMessageReceivedEventArgs args)
{
var postMess = args.TryGetWebMessageAsString();
if (postMess == "onFocus(nameOfField)" )
{
// here activate the button(keyboard)
// store the Name on focusField variable
}
if (postMess == "onBlur" && paneShown)
{
// here deactivate the button(keyboard)
// release the focusField
}
}
现在您可以向输入字段发送点击事件:
private void btn_Clicked(Object sender, EventArgs args)
{
var script = "var field "+
"= document.getElementsByName("+focusField+");" +
" field.value+=field.value"+args.keyValue();
wv2.CoreWebView2.ExecuteScriptAsync(script);
}
wv2
是WebView2
的一个实例,这里直接敲代码,没有编译。希望你明白了。