C# 子WPF窗口中的模态对话框

C# 子WPF窗口中的模态对话框,c#,wpf,windows,modal-dialog,C#,Wpf,Windows,Modal Dialog,在多进程C#WPF应用程序中,我有以下场景: MainApplication有一个占位符来包含子进程的HWND 使用SetParent和其他一些windows函数(p/Invoke、windows API),我可以将子应用程序设置为在主应用程序中运行,而不让用户知道它们是两个进程。 到目前为止,一切都很顺利 问题是每次我从子进程打开模态对话框时,模态对话框实际上不是模态的。相反,如果我独立运行子应用程序(相同的exe),模式对话框将正常工作 使用Spy++我意识到,如果作为子进程运行(未按预期工

在多进程C#WPF应用程序中,我有以下场景:

MainApplication有一个占位符来包含子进程的HWND

使用SetParent和其他一些windows函数(p/Invoke、windows API),我可以将子应用程序设置为在主应用程序中运行,而不让用户知道它们是两个进程。 到目前为止,一切都很顺利

问题是每次我从子进程打开模态对话框时,模态对话框实际上不是模态的。相反,如果我独立运行子应用程序(相同的exe),模式对话框将正常工作

使用Spy++我意识到,如果作为子进程运行(未按预期工作),模式对话框的所有者是桌面;如果独立运行(按预期工作),则是正确的应用程序窗口

我还尝试在对话框上使用::SetParent,但没有任何变化,似乎当从托管进程创建对话框时,WPF无法正确设置其父级

我做错什么了吗


编辑:当然,我尝试使用wpf方法(也是WindowInteropHelper)设置对话框的所有者。

这是delphi,不是c#,但原理不变。好的,Chrome是一个特殊的例外。回答“他们是如何做到的”这个问题一点也不简单。我并不是说托管多个进程是不可能的——只是让它正常工作非常困难。Chrome有一个庞大的代码库来管理这些进程的所有细微差别——对低级WinAPI的非常深入的微观管理,非常小心的错误和异常处理,等等。此外,Chrome是一个特例,托管进程都是受控代码库的一部分,编写时希望托管在父进程中。对于您可能尝试移植到自己的程序中的几乎任何其他随机应用程序,都不能这样说。在几乎任何其他可想象的情况下,当面对一个进程内的另一个进程的愿望时,通常认真地重新考虑体系结构是非常可取的。例如,要考虑的其他事项:甚至Jon Skeet也说“小心!”:这是delphi,不是c#,但原理是一样的。好吧,Chrome是一个特殊的例外。回答“他们是如何做到的”这个问题一点也不简单。我并不是说托管多个进程是不可能的——只是让它正常工作非常困难。Chrome有一个庞大的代码库来管理这些进程的所有细微差别——对低级WinAPI的非常深入的微观管理,非常小心的错误和异常处理,等等。此外,Chrome是一个特例,托管进程都是受控代码库的一部分,编写时希望托管在父进程中。对于您可能尝试移植到自己的程序中的几乎任何其他随机应用程序,都不能这样说。在几乎任何其他可想象的情况下,当面对一个进程内的另一个进程的愿望时,通常认真地重新考虑体系结构是非常可取的。例如,要考虑的其他事项:甚至Jon Skeet也说“小心!”:这是delphi,不是c#,但原理是一样的。好吧,Chrome是一个特殊的例外。回答“他们是如何做到的”这个问题一点也不简单。我并不是说托管多个进程是不可能的——只是让它正常工作非常困难。Chrome有一个庞大的代码库来管理这些进程的所有细微差别——对低级WinAPI的非常深入的微观管理,非常小心的错误和异常处理,等等。此外,Chrome是一个特例,托管进程都是受控代码库的一部分,编写时希望托管在父进程中。对于您可能尝试移植到自己的程序中的几乎任何其他随机应用程序,都不能这样说。在几乎任何其他可想象的情况下,当面对一个进程内的另一个进程的愿望时,通常认真地重新考虑体系结构是非常可取的。例如,要考虑的其他事项:连乔恩·斯基特都说“小心!”