如何获取边缘窗口句柄 (HWND)?

How to get Edge window handle (HWND)?

本文关键字:窗口句柄 HWND 边缘 获取 何获取      更新时间:2023-10-16

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

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

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

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

可以使用GetWindow获取边缘窗口句柄,将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);
}

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

WebView2 SDK 不提供此 HWND,因为 WebView2 连接到提供的父 HWND 的确切方式旨在成为实现详细信息,即使您使用相同版本的 WebView2 SDK,该实现细节也可能随着基础边缘浏览器或 WebView2 运行时的更新而更改。我们在很大程度上依赖于浏览器的逻辑进行渲染,因此将来可能会发生变化。

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