System.InvalidOperationException:“寄宿的 HWND 必须是指定父级的子窗口。”
当试图在 WPF 窗口中嵌套显示 Win32 子窗口的时候,你有可能出现错误:“寄宿的 HWND 必须是指定父级的子窗口。
”。
这是很典型的 Win32 错误,本文介绍如何修复此错误。
本文内容
- 问题
- 原因和解决办法
我们在 MainWindow
中嵌入一个其他的窗口来承载新的 WPF 控件。一般情况下我们当然不会这么去做,但是如果我们要跨越进程边界来完成 WPF 渲染内容的融合的时候,就需要嵌入一个新的窗口了。
WPF 中可以使用 HwndSource
来包装一个 WPF 控件到 Win32 窗口,使用自定义的继承自 HwndHost
的类可以把 Win32 窗口包装成 WPF 控件。由于窗口句柄是可以跨越进程边界传递的,所以这样的方式可以完成跨进程的 WPF 控件显示。
问题
你有可能在调试嵌入窗口代码的时候遇到错误:
System.InvalidOperationException:“寄宿的 HWND 必须是指定父级的子窗口。”
英文是:
Hosted HWND must be a child window of the specified parent.
原因和解决办法
出现此错误,是因为同一个子窗口被两次设置为同一个窗口的子窗口。
具体来说,就是 A 窗口使用 HwndHost
设置成了 B 的子窗口,随后 A 又通过一个新的 HwndHost
设置成了新子窗口。
要解决,则必须确保一个窗口只能使用 HwndHost
设置一次子窗口。
我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。
如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。