C#怎么样把另一个应用程序域的Form窗口作为当前应用程序域中MDI窗口容器的子窗口 10

简单的说,就是当前默认的应用程序域中把一个窗口作为MDI窗口容器,显然,对当前应用程序域的其他窗口,可以通过简单的设置变成该窗口容器的MDI子窗口。但是,我的开发中需要创... 简单的说,就是当前默认的应用程序域中把一个窗口作为MDI窗口容器,显然,对当前应用程序域的其他窗口,可以通过简单的设置变成该窗口容器的MDI子窗口。但是,我的开发中需要创建一个应用程序域,让新建的应用程序域加载了一个程序集(比如叫A.exe的.Net程序集),其中A.exe是有自己的窗口界面的。我现在想把A.exe的界面作为当前应用程序域窗口容器的一个MDI子窗口,应该怎么做。因为跨越了应用程序域后,对象并不能直接访问。求高人指点。
楼下的回答其实是解决了把一个窗口置于另外一个窗口中的问题。实际上我的需求不是这样子的,注意,我是在程序中先用 newAppDomain = AppDomain.CreateDomain("ExternFormApp");先创建一个程序域,然后newAppDomain.CreateInstanceFromAndUnwrap(A.exe)加载一个程序集文件,然后实例化其中的一个窗口类。我不但要把该窗口类作为MDI子窗口,实际上我还要和它有交互。
展开
 我来答
木可之滨
2014-08-15 · TA获得超过129个赞
知道小有建树答主
回答量:173
采纳率:0%
帮助的人:92.7万
展开全部

简单说下原理吧:

  1. 假设A程序以及运行,需要在A中放一个容器(A本身也可以)去存放一会将要运行的B程序。

  2. 启动B程序,并获取B程序的句柄,这个需要调用Win32 API,引用如下

        [DllImport("user32.dll", EntryPoint = "FindWindow")]

        public static extern int FindWindow(

            string lpClassName,

            string lpWindowName

        );

    3. 还是调用Win32 API,将A程序的容器设置成B容器的父对象,引用如下        

        [DllImport("user32.dll", EntryPoint = "SetParent")]

        public static extern int SetParent(

            int hWndChild,

            int hWndNewParent

        );

A程序中的代码:

        System.Diagnostics.Process.Start("B.exe");

        SetParent(FindWindow(null, "B程序的Title"), this.Handle.ToInt32());


当然了,获取B程序的句柄,办法更多,直接用processinfo最好,只需要一句代码即可:

        SetParent(System.Diagnostics.Process.Start("B.exe").Handle, this.Handle.ToInt32());

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式