webView.Source = new Uri("https://...");或
webView.CoreWebView2.Navigate("https://...");
using Microsoft.Web.WebView2.Core; private void webView_NavigationStarting(object sender, CoreWebView2NavigationStartingEventArgs e) { String uri = e.Uri; if (!uri.StartsWith("https://")) { webView.CoreWebView2.ExecuteScriptAsync($"alert('{uri} is not safe, try an https link')"); e.Cancel = true; } }
webView.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync("...");
webView.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync("window.chrome.webview.addEventListener(\'message\', event => alert(event.data));");
[ClassInterface(ClassInterfaceType.AutoDual)] [ComVisible(true)]
/ 用於向網頁註冊 C# 對象,供 JS 調用的類別 [ClassInterface(ClassInterfaceType.AutoDual)] [ComVisible(true)] public class WebViewClass { // 秀出由 JS 傳入的訊息 public void ShowMessage(string message) { MessageBox.Show(message); } // 計算出結果後,傳回 JS public int GetResult(int x, int y) { int r = x + y; // 多了底下的秀出功能時,傳回 js 就有問題了。 // MessageBox.Show(r.ToString()); return r; } }
MessageBox.Show(r.ToString());網頁就沒有印出結果,原因不明。
webView.CoreWebView2.AddHostObjectToScript("webViewClass", new WebViewClass());
public Form1() { InitializeComponent(); // 處理網頁相關的資料 InitializeAsync(); } async void InitializeAsync() { // 要先執行非同步的 EnsureCoreWebView2Async 才會觸發控件的 CoreWebView2 的初始化 await webView.EnsureCoreWebView2Async(null); // 向網頁提供可呼叫的類別 WebViewClass,第一個參數是名稱,第二個參數是類別實體 webView.CoreWebView2.AddHostObjectToScript("webViewClass", new WebViewClass()); }
<body> <p>測試呼叫 WebView2 主機</p> <a href="" onclick="test1();"> 測試一:主機印出訊息 "Message From Web"。</a> <br> <a href="" onclick="test2();"> 測試二:印出主機傳回訊息。</a> <script> // 指定主機程式中可供 js 呼叫的類別 var host = window.chrome.webview.hostObjects.webViewClass; async function test1() { // 呼叫主機程式中的 ShowMessage 函式 await host.ShowMessage("Message From Web"); return false; } // 有異步函式,要用 async async function test2() { // 呼叫主機程式中的 GetResult 函式,因為要等傳回值,所以要用 await 異步處理 var ans = await host.GetResult(20,30); alert(ans); return false; } </script> </body>
await host.GetResult(20,30);
<html> <head> <title>Test Post Message</title> </head> <body> <p>測試 Post Message</p> <a href="" onclick="window.chrome.webview.postMessage('Web Message'); return false;">送出網頁訊息</a> <script> window.chrome.webview.addEventListener("message", e => { alert("網頁收到:" + e.data); }); </script> </body> </html>
<a href="" onclick="window.chrome.webview.postMessage('Web Message'); return false;">送出網頁訊息</a>
private void button1_Click(object sender, EventArgs e) { if (webView.CoreWebView2 != null) { webView.CoreWebView2.PostWebMessageAsString("webView2 Message"); } } private void webView_WebMessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs e) { string msg = e.TryGetWebMessageAsString(); MessageBox.Show($"主機收到:{msg}"); }
webView.CoreWebView2.PostWebMessageAsString("webView2 Message");