单击网页提交按钮后关闭 webview2 应用程序

Close webview2 application after webpage submit button click

我创建了一个简单的 windows 应用程序,它使用 webview2 在 winform 中显示网站。单击网站上的提交按钮后,我需要关闭此 windows 应用程序。

可能吗? 我是 Windows 开发新手。

解决方案实际上取决于页面的内容和工作方式。在大多数情况下,您不应该在点击提交按钮后立即关闭应用程序,您需要等到收到提交的响应,如果提交成功,然后您可以关闭 window.

这里分享两个例子:

  1. 处理提交事件并从 WebView2 调用 C# 方法
  2. 根据 URL
  3. 检测提交的调查表是否成功

请记住,这里的两个示例都是为了学习目的,让您了解如何在 C# 中处理 js 事件。您需要调整它们以使其适用于您的特定情况。

示例 1 - 处理提交事件并从 WebView2 调用 C# 方法

在下面的例子中你可以了解到:

  • 如何处理submit表单的事件
  • 如何从 JavaScript 代码调用 C# 方法并将 js 对象传递给 .NET

代码如下:

WebView2Host host;
private async void TestForm_Load(object sender, EventArgs e)
{
    await webView21.EnsureCoreWebView2Async();
    host = new WebView2Host(this);
    webView21.NavigateToString(
        "<html>" +
        "<head><title>Test from</title></head>" +
        "<body>" +
        "<form id='form1' action='/' method='post'>" +
        "<input type='text' name='someProperty' value ='something'/>" +
        "<input type='submit' value='Click me'/>" +
        "</form>" +
        "</body>");
    webView21.CoreWebView2.AddHostObjectToScript("host", host);
    webView21.CoreWebView2.DOMContentLoaded += CoreWebView2_DOMContentLoaded;
}
private async void CoreWebView2_DOMContentLoaded(object sender,
    CoreWebView2DOMContentLoadedEventArgs e)
{
    await webView21.ExecuteScriptAsync(
    "var form = document.getElementById('form1');" +
    "form.addEventListener('submit', function(e){" +
    "var data = JSON.stringify(Object.fromEntries(new FormData(form)));" +
    "window.chrome.webview.hostObjects.sync.host.OnSubmit(data);" +
    "});");
}
public class WebView2Host
{
    TestForm hostForm;
    public WebView2Host(TestForm hostForm)
    {
        this.hostForm = hostForm;
    }
    public void OnSubmit(string data)
    {
        //data is in json format
        MessageBox.Show($"data: {data}", "C# OnSubmit!");
        //You can close form like this: hostForm.Close();
    }
}

示例 2 - 根据 URL

检测提交的调查表是否成功

你可以依赖任意一个navigation events,查看页面的URL,看是否提交成功。在这个例子中,我展示了如何使用 google 调查表:

private async void TestForm_Load(object sender, EventArgs e)
{
    await webView21.EnsureCoreWebView2Async();
    webView21.Source = new Uri("https://forms.gle/pspLBJFZW5z8J1K37");
    webView21.CoreWebView2.SourceChanged += CoreWebView2_SourceChanged;
}
private void CoreWebView2_SourceChanged(object? sender, 
    CoreWebView2SourceChangedEventArgs e)
{
    if (webView21.Source.ToString().EndsWith("/formResponse"))
    {
        MessageBox.Show("Submitted successfully.");
    }
}