2011-10-05 83 views
0

我有一个WPF可执行文件,我希望另一个程序启动它并将此启动程序设置为我的WPF可执行文件的父窗口(主要目的是当启动程序关闭时,WPF可执行文件也会关闭)。我想我可以这样做:我将Hwnd作为一个命令行参数(如integer-string)传递,并且我可以调用SetParent或WPF可执行代码内的任何函数来指定父级。但是,我无法让它工作。任何人都可以告诉我该怎么做,或者其他任何方式来做到这一点?谢谢!启动WPF可执行文件并设置父级?

回答

2

你不能。窗口句柄是每个进程。

此外,你不想。在另一个线程中有一个父窗口 - 这会导致两个线程的消息队列被连接,即它们有效地共享相同的消息队列。所以现在如果或者线程锁定,或者做了一些冗长的处理,两个线程都被冻结。 (就我所知,没有办法稍后分离消息队列。)想象一下,试图扩展这个跨进程。

如果您必须启动一些新代码并使用现有窗口作为父项,则无法进行跨进程。您必须将WPF代码加载到您的流程中,并调用其中的方法,将父窗口作为参数传递。将代码加载到进程中的最简单方法是将您的WPF应用程序更改为类库(.dll),并添加对该.dll的引用,或使用反射动态加载它。

+0

谢谢你的回复。尽管我对互操作性的经验不多,但我明白你的观点。但我想问一个更技术性的问题:如果我将.exe更改为.dll(所以现在它在同一个线程中),我可以如何设置父级?我尝试使用Declare Function来使用Windows API的Findwindow和SetParent函数,但仍不知道如何获取可执行窗口的Hwnd。谢谢! – tete

+0

设置Window.Owner属性。 http://msdn.microsoft.com/en-us/library/system.windows.window.owner.aspx –

0

正如@Joe说白了,你不能做到这一点通俗易懂...我想我能“猜”你在....

让你可能有一个WinForm MDI父(其EXE的话)和您想要启动另一个WPF窗口(另一个exe)作为其子。我对么?

Hmmmm,那么你就必须创建一个新的WinForm子窗口,在它WinFormWPFHostApp,然后参考WPF的组件,以这个项目,并尝试从其他WPF应用程序托管MainWindowContent

参考this文章...

+0

谢谢你的回复。我想我们的情况更加复杂:我们在MS Access中有一个传统的SW wirtten。我们希望切换到.Net,但这一定很长。所以现在我们想用.Net来实现一些新的需求,但显然必须将它与我们传统的MS Access软件整合在一起。所以,我的问题来了。 – tete

相关问题