2

我使用 CreateCoreWebView2Host() 方法创建了边缘浏览器窗口。此方法获取父窗口句柄并创建子窗口,我们可以在其中导航网页。完成导航后,我需要返回我的窗口句柄,我相信我无法返回。

在 Spy++ 上,我看到“Chrome_WidgetWin_0”、“Chrome_WidgetWin_1”、“中间 D3D 窗口”作为我父窗口的子窗口。哪一个是子窗口句柄?我以为我正在创建一个子窗口。

我尝试使用传递上述类名的 FindWindowEx() 获取窗口句柄。但在我的项目中仍然没有得到预期的结果。所以我怀疑我是否传递了正确的句柄。

现在的问题是,如何获取 CreateCoreWebView2Host 创建的窗口的窗口句柄(HWND)?

4

2 回答 2

2

GetWindow您可以通过使用, 将Handle控制WebView2权作为第一个参数和第二个参数传递给它来获取边缘窗口句柄GW_CHILD。例如:

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);
}

注意:您可能会发现这个GitHub 线程很有用。这也是我用来将浏览器集中在 Windows 窗体中的技巧。

于 2021-02-18T12:26:35.497 回答
0

WebView2 SDK 不提供此 HWND,因为 WebView2 连接到提供的父 HWND 的确切方式旨在成为一个实现细节,即使您使用相同版本的 Edge 浏览器或 WebView2 运行时更新,也可能会发生变化WebView2 SDK。我们在很大程度上依赖于浏览器的渲染逻辑,所以这在未来可能会改变。

CoreWebView2Host(在最近的 SDK 版本中已重命名为CoreWebView2Controller )没有提供 HWND,而是为您提供了各种聚焦、缩放等方法。你想用 HWND 做什么?

于 2020-07-01T20:53:49.537 回答