gpt4 book ai didi

.net - 强制初始化 HwndHost

转载 作者:行者123 更新时间:2023-12-02 08:41:31 27 4
gpt4 key购买 nike

在我的 WPF 应用程序中,我使用 HwndHost 托管 Win32 内容。但是,创建 HwndHost 并不会创建 native 窗口。相反,这是在重写的 BuildWindowCore() 方法中完成的,该方法稍后由 WPF 调用。

我的托管内容需要 native 窗口的窗口句柄来进行自身初始化。不幸的是,我无法强制创建窗口(即让 WPF 调用 BuildWindowCore),因此我有第二个线程轮询 HwndHost 直到它被初始化。

在 .NET 4.0/WPF 4.0 中,添加了新方法 WindowInteropHelper.EnsureHandle()。我本来希望这能解决这个问题,但它只适用于 Window,而不适用于 HwndHost(它不是从 Window 派生的)。您有什么建议我可以做什么吗?

编辑:

我忘记为可能的解决方案添加更多约束:

  1. HwndHost 放置在一个控件中,根据用户设置,该控件可以是应用程序主窗口的子窗口,也可以放置在新窗口中(通过第三方停靠管理器)。这意味着在创建窗口期间我不确定父窗口(及其 hWnd)是什么。
  2. 虽然 native 代码在初始化期间需要 hWnd,但该窗口仅在用户请求显示时才显示(即,它最初是不可见的)。如果可能的话,应该避免需要显示窗口,然后立即再次隐藏它。

最佳答案

似乎没有完美的解决方案。与提出问题时相比,我稍微改变了我的方法:

在我的 HwndHost 派生类的构造函数中,我将(可能的)父 hWnd 作为参数之一。然后,我使用 native CreateWindow() 方法和给定的父 hWnd 创建 native 窗口。我将创建的 hWnd 存储在一个单独的属性中,我在任何地方都使用该属性,而不是 HwndHost 的 Handle 属性。这样,我就不需要显示窗口(这解决了约束#2)。

在重写的 BuildWindowCore() 方法中,我将给定的父 hWnd 与构造函数中给定的 hWnd 进行比较。如果它们不同,我将使用 native SetParent() 方法重新设置我的托管窗口的父级(这解决了约束 #1)。请注意,这依赖于没有人存储父 hWnd!

在代码中,相关部分(检查省略):

public class Win32Window : HwndHost
{
public Win32Window(IntPtr parentHwnd)
{
this.ParentHwnd = parentHwnd;
this.Win32Handle = NativeMethods.CreateWindowEx( /* parameters omitted*/ );
}

public IntPtr Win32Handle { get; private set; }
private IntPtr ParentHwnd { get; set; }

protected override HandleRef BuildWindowCore(HandleRef hwndParent)
{
if (hwndParent.Handle != this.ParentHwnd)
{
NativeMethods.SetParent(this.Win32Handle, hwndParent.Handle);
}

return new HandleRef(this, this.Win32Handle);
}
}

关于.net - 强制初始化 HwndHost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3871038/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com