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);
        }

现在您收集输入字段并向这些输入字段添加 onfocusonblur 事件,例如在 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);
        }

wv2WebView2的一个实例,这里直接敲代码,没有编译。希望你明白了。