如何获取 Edge window 句柄 (HWND)?

How to get Edge window handle (HWND)?

我使用 CreateCoreWebView2Host() 方法创建了边缘浏览器 window。此方法采用 parent window 句柄并创建 child window 我们可以在其中导航网页。完成导航后,我需要 return 我的 window 手柄,我相信我没能做到 return.

在 Spy++ 上,我将“Chrome_WidgetWin_0”、“Chrome_WidgetWin_1”、“中级 D3D Window”视为 child windows [=27] =] window。哪个是 child window 句柄?我以为我正在创建一个 child window.

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

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

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

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

您可以通过使用 GetWindow 获得边缘 window 句柄,将 WebView2 控制的 Handle 作为第一个参数传递给它,并将 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);
}

注意:您也可以在 Windows 表单中找到此 GitHub thread useful. This is the trick that I've used to