WebView2 目前可以接收键盘输入吗?

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

我正在尝试在 WPF 中创建一个软件,该软件托管一个浏览器(WebView2 目前为 1.0.818.41),并且当浏览器中有一个输入字段时,还会显示

OnScreenKeyboard

我以前在 WPF 中使用 CefSharp 做过这种事情,但目前无法使用 WebView2 做到这一点。我的问题是我找不到将击键从

OnScreenKeyboard
(或从 WPF 窗口)发送到浏览器的方法。

在 CefSharp 中,我们有一个名为

ChromiumWebBrowser.GetHost().SendKeyEvent()
的函数,但我在 WebView2 中找不到类似的东西。

我是盲目的还是目前尚未实施(或可能未计划)?

提前谢谢您!

wpf on-screen-keyboard webview2
1个回答
0
投票

没有直接的方法。可以做的是执行一些 JS,然后将消息发送到 WebView。然后可以在

wv2_WebMessageReceived
事件中捕获此消息。

有关于 .NET 和 JS 之间的互操作以及 JS 和 .NET WPF 表单之间的互操作的大量文档这里

解决方案是在

sendMessage
事件中注入
NavigationStarting
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
的一个实例,代码直接在这里输入,不编译。希望你能明白。

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