如何获得Edge窗口句柄(HWND)?

3
我使用CreateCoreWebView2Host()方法创建了Edge浏览器窗口。该方法需要父窗口句柄,并创建一个子窗口,我们可以在其中导航到网页。完成导航后,我需要返回我的窗口句柄,但我认为我没有成功返回。
在Spy++中,我看到"Chrome_WidgetWin_0"、"Chrome_WidgetWin_1"和"Intermediate D3D Window"作为我的父窗口的子窗口。哪一个是子窗口句柄?我原以为只创建了一个子窗口。
我尝试使用FindWindowEx()获取窗口句柄,通过传递上述类名,但在我的项目中仍然无法获得预期结果。因此,我怀疑我是否传递了正确的句柄。
现在的问题是,如何获取由CreateCoreWebView2Host创建的窗口句柄(HWND)?

你有用过Spy++来嗅探那个子窗口的类名吗? - undefined
是的,我做过了。子类的名称在问题中。 - undefined
@TippuR 你解决过这个问题吗? - undefined
@Chris:我创建了另一个子窗口,在其中启动了Edge浏览器。该函数返回子窗口的句柄。 - undefined
那个句柄能够返回WM_NCHITTEST或类似的内容吗? - undefined
2个回答

4

您可以使用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 Forms中使用的聚焦浏览器的技巧。


1
WebView2 SDK不提供此HWND,因为WebView2如何连接到提供的父HWND是一个实现细节,即使您在相同版本的WebView2 SDK上保持不变,基础Edge浏览器或WebView2运行时更新时也可能发生更改。我们在很大程度上依赖于浏览器的渲染逻辑,因此这可能会在未来发生变化。
CoreWebView2Host(在最新的SDK发布中已经更名为CoreWebView2Controller)提供了各种方法来进行焦点、缩放等操作,而不是提供HWND。您想使用HWND做什么?

调用我的方法的模块处理窗口大小调整事件。我需要为给定的父窗口创建子窗口,导航网页并返回子窗口句柄。现在我不知道如何返回它,因为CreateCoreWebView2Host()正在创建子窗口。 - undefined
1
没有支持的方法来获取WebView2 HWND以满足您描述的接口合约。如前所述,不建议使用不受支持的机制来获取WebView2 HWND,因为它们可能在将来失效。如果您愿意,可以在https://github.com/MicrosoftEdge/WebViewFeedback上提出功能请求。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接