我正在尝试在 WPF 中创建一个软件,该软件托管一个浏览器(WebView2 目前为 1.0.818.41),并且当浏览器中有一个输入字段时,还会显示
OnScreenKeyboard
。
我以前在 WPF 中使用 CefSharp 做过这种事情,但目前无法使用 WebView2 做到这一点。我的问题是我找不到将击键从
OnScreenKeyboard
(或从 WPF 窗口)发送到浏览器的方法。
在 CefSharp 中,我们有一个名为
ChromiumWebBrowser.GetHost().SendKeyEvent()
的函数,但我在 WebView2 中找不到类似的东西。
我是盲目的还是目前尚未实施(或可能未计划)?
提前谢谢您!
没有直接的方法。可以做的是执行一些 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
的一个实例,代码直接在这里输入,不编译。希望你能明白。