WinForm打开时如何关注WebView2?

Posted

技术标签:

【中文标题】WinForm打开时如何关注WebView2?【英文标题】:How to focus on WebView2 when WinForm is opened? 【发布时间】:2021-05-21 07:46:31 【问题描述】:

我有一个 WinForm 应用程序,它只有一个显示本地网站的 WebView2。

该应用程序是从另一个应用程序启动的,一旦它运行,用户将扫描一些东西,问题是一旦我的应用程序运行 WebView2 就没有焦点,所以当用户扫描项目时,我没有处理它们网页。

只有在我点击控件后,我才能做我的事情。

应用程序启动后如何将焦点设置到我的 WebView?

我在表单加载中尝试了以下方法:

private void Form1_Load(object sender, EventArgs e)

    webView.Source = new Uri(System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\\XXXX\\index.html");

    TopMost = true;
    Focus();
    BringToFront();
    Activate();
    webView.Focus();

【问题讨论】:

这是一个known issue,它已在我测试的最新预发布包(1.0.790-prerelease)中得到修复,但不幸的是在此之前的最后一个稳定版本中没有。 【参考方案1】:

这是一个known issue,它已在我测试的最新预发布包(1.0.790-prerelease)中得到修复,但不幸的是,在此之前的最后一个稳定版本中没有。因此,如果您使用的是最新的预发布版本,则足以调用:

webView21.Focus();

旧版本

但作为一种变通方法,你可以订阅NavigationCompleted,然后找到浏览器子窗口并设置焦点:

public const uint GW_CHILD = 5;
[DllImport("user32.dll")]
public static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);
[DllImport("user32.dll")]
public static extern IntPtr SetFocus(IntPtr hWnd);

WebView2 webView21 = new Microsoft.Web.WebView2.WinForms.WebView2();
private async void Form1_Load(object sender, EventArgs e)

    webView21.Dock = DockStyle.Fill;
    this.Controls.Add(webView21);
    await webView21.EnsureCoreWebView2Async();
    webView21.Source = new Uri("https://bing.com");

    webView21.NavigationCompleted += WebView21_NavigationCompleted;


private void WebView21_NavigationCompleted(
    object sender, CoreWebView2NavigationCompletedEventArgs e)

    var child = GetWindow(webView21.Handle, GW_CHILD);
    SetFocus(child);

【讨论】:

感谢@IgorMytyuk 的反馈很高兴听到您能够解决问题。我也尝试了第二种方法,并且旧版本可以正常工作。如果您想再试一次,请确保您已附加所有事件处理程序。 旧版本的解决方案适用于当前版本 1.0.705.50 @VeljaRadenkovic 我希望旧版本的解决方案适用于所有新版本。 (但由于它依赖于实现细节 - 子窗口句柄 - 无法保证。)

以上是关于WinForm打开时如何关注WebView2?的主要内容,如果未能解决你的问题,请参考以下文章

WinForm(十三)WebView2

WebView2如何加载本地文件?

如何在打开时仅在模式弹出窗口内限制 Tab 键按下?

2016.4.6 WinForm显示PDF两种方法

C#...WinForm如何保存最近一次登录的账号?

winform(MDI窗体容器权限设置)