重新显示WindowsFormsHost

时间:2017-08-22 06:44:21

标签: c# wpf

我有一个执行以下操作的程序:

  • 创建WPF控件
  • 用户重新显示以在另一个窗口(记事本)中显示控件
  • 将WindowsFormsHost添加到控件

代码是

UserControl1 control = new UserControl1();
control.AddFormsHostWithDelay(TimeSpan.FromSeconds(2));;
if (this.TryGetHandleFromName("Notepad", out IntPtr handle))
{
   HwndSourceParameters pa = new HwndSourceParameters("WPF Source", 400, 300);
   pa.ParentWindow = handle;
   pa.WindowStyle = 0x40000000 | 0x10000000; // child and visible
   pa.UsesPerPixelOpacity = false;
   pa.SetPosition(5, 5);
   HwndSource src = new HwndSource(pa);
   src.RootVisual = control;
}

该代码工作多年,但自Windows10 CreatorsUpdate以来,一旦添加了WindowsFormsHost,它就会崩溃。消息和堆栈跟踪是

'CreatorsUpdateCrashDemo.exe' (CLR v4.0.30319: 
CreatorsUpdateCrashDemo.exe): Loaded 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\PrivateAssemblies\Runtime\Microsoft.VisualStudio.Debugger.Runtime.dll'. 

Unhandled Exception: System.InvalidOperationException: Hosted HWND must be a child window of the specified parent.
at System.Windows.Interop.HwndHost.BuildWindow(HandleRef hwndParent)
at System.Windows.Interop.HwndHost.BuildOrReparentWindow()
at System.Windows.Interop.HwndHost.OnSourceChanged(Object sender, SourceChangedEventArgs e)

可在http://www.seetec.eu/entwicklung/BRAU/CreatorsUpdateCrash.zip

找到完整演示

如何重现:

  • 使用Windows10 CreatorsUpdate
  • 下载演示
  • 启动记事本
  • 启动CreatorsUpdateCrashDemo
  • 单击崩溃按钮
  • 应用程序在2秒后崩溃

有人知道要改变什么来避免这次崩溃吗?在进行重新显示之前添加FormsHost可以解决问题,但在实际应用程序中是不可能的。

其他信息:

问题显然在WindowsFormsHost中。使用CreatorsUpdate更改了BuildWindowCore方法中的某些内容。在HwndHost.BuildWindow中调用BuildWindowCore后,有一些检查,其中一个失败。特别是HwndHost中的代码:

// Make sure the child window is the child of the expected parent window.
if(hwndParent.Handle != UnsafeNativeMethods.GetParent(_hwnd))
{
    throw new InvalidOperationException(SR.Get(SRID.ChildWindowMustHaveCorrectParent));
}

更多附加信息:我发现设置"覆盖高dpi缩放行为"在可执行文件的属性中解决了问题。这可能是一种解决方法,但我仍然想了解发生了什么。我所做的只是不支持吗?有没有更好的方法呢?

Screenshot of application's properties dialog

1 个答案:

答案 0 :(得分:0)

在您的计算机和解决方案上更新.Net Framework,不要忘记NuGet更新。