当前位置:编程学习 > C#/ASP.NET >>

c# 如何将一个winform窗体嵌入另一个winform窗体(注意是嵌入,两个窗体要在不同的进程中)

将其他的应用程序窗体嵌入winform窗体网上的资料很多,可以嵌入记事本,world,excel等,
但将一个自己写的应用程序窗体嵌入就不行了,请高手指点一下 --------------------编程问答-------------------- 没有人回答,自己先顶一下 --------------------编程问答-------------------- 用一个Panel 容器 --------------------编程问答-------------------- 难道Form不能算一个容器吗?用什么无所谓,重点是怎样嵌入 --------------------编程问答--------------------         [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public extern static IntPtr SetParent(IntPtr hChild, IntPtr hParent);


这个可以. --------------------编程问答--------------------

            frm = new Form7();
            frm.TopLevel = false;
            this.panel1.Controls.Add(frm);
            frm.Show();
--------------------编程问答-------------------- 可以通过 IntPtr hWnd 窗口句柄
楼主不妨找找 --------------------编程问答-------------------- 这个我试过了,不能将winform窗体嵌入,其它的窗体还可以 --------------------编程问答-------------------- 这种方法我也试过了,正因为在网上找不到才来这里问的 --------------------编程问答--------------------
引用 5 楼 wxm3630478 的回复:
C# code
            frm = new Form7();
            frm.TopLevel = false;
            this.panel1.Controls.Add(frm);
            frm.Show();

请你先看清楚问题,我要的是两个窗体在不同的进程中,这种方式两个窗体是在同一个进程中的 --------------------编程问答-------------------- mark --------------------编程问答--------------------
引用 4 楼 zgke 的回复:
        [DllImport("user32.dll", CharSet = CharSet.Auto)] 
        public extern static IntPtr SetParent(IntPtr hChild, IntPtr hParent); 


这个可以.

这种方法我试过了,其它的窗体还可以,就是winform窗体不行 --------------------编程问答-------------------- 这个就 不知道了 --------------------编程问答--------------------
引用 11 楼 liutao409 的回复:
引用 4 楼 zgke 的回复:
        [DllImport("user32.dll", CharSet = CharSet.Auto)] 
        public extern static IntPtr SetParent(IntPtr hChild, IntPtr hParent); 


这个可以. 
 
这种方法我试过了,其它的窗体还可以,就是winform窗体不行

你说的这个方法不适用于自己写的程序,会不会是因为自己这个程序是运行于.net下面,调用上面的api的时候,没有传进去正确的参数呢?如child程序的句柄 --------------------编程问答--------------------
引用 13 楼 longhui666888 的回复:
引用 11 楼 liutao409 的回复:
引用 4 楼 zgke 的回复: 
        [DllImport("user32.dll", CharSet = CharSet.Auto)] 
        public extern static IntPtr SetParent(IntPtr hChild, IntPtr hParent); 


这个可以. 

这种方法我试过了,其它的窗体还可以,就是winform窗体不行 
 
你说的这个方法不适用于自己写的程序,会不会是因为自己这个程序是运行于.net下面,调用上面的api的时候,没有传进去正确的参数呢?如…


老大,我写程序好几年了,不会犯这些低级的错误,不相信的话你可以写个程序试一下 --------------------编程问答--------------------
引用 14 楼 liutao409 的回复:
老大,我写程序好几年了,不会犯这些低级的错误,不相信的话你可以写个程序试一下


怎么不行..这个使用要注意位置的, --------------------编程问答-------------------- 试了一下4楼的方法,对于下面三种情况是可以的:
非托管-->非托管
托管-->非托管
非托管-->托管

但是如果两个进程都是托管程序,则出现“内存不足”的异常。 --------------------编程问答-------------------- 学习了,,, --------------------编程问答-------------------- An application can use the SetParent function to set the parent window of a pop-up, overlapped, or child window. The new parent window and the child window must belong to the same application. 
MSDN的原话. --------------------编程问答-------------------- 至于嵌入的word,excel那些应该属于ole吧... --------------------编程问答-------------------- .NET WinForm 不支持Ole,这是MSDN上说的,所以楼主要的功能很难实现  --------------------编程问答-------------------- EXCEL WORD 可以使用控件web浏览器
WebBrowser..

但是嵌入另一个成应程序的Form 就没了解过 --------------------编程问答--------------------
引用 14 楼 liutao409 的回复:
引用 13 楼 longhui666888 的回复:
引用 11 楼 liutao409 的回复:
引用 4 楼 zgke 的回复:
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public extern static IntPtr SetParent(IntPtr hChild, IntPtr hPa……

人品决定成败,而不是技术。 --------------------编程问答--------------------
引用 5 楼 wxm3630478 的回复:
C# code

            frm = new Form7();
            frm.TopLevel = false;
            this.panel1.Controls.Add(frm);
            frm.Show();


这个可以  --------------------编程问答-------------------- 因为你传入API的窗口句柄不是你要的那个窗口句柄。
把 Main() 写到你那个窗口类中,就可以了。

我记得是这样的,以前试过。 --------------------编程问答--------------------
引用 24 楼 cja03 的回复:
因为你传入API的窗口句柄不是你要的那个窗口句柄。
把 Main() 写到你那个窗口类中,就可以了。

我记得是这样的,以前试过。


这个也不行 --------------------编程问答-------------------- 都一年多了,楼主,这个问题解决了么? --------------------编程问答-------------------- 我也想知道答案 --------------------编程问答--------------------
引用 26 楼 oldfatcat 的回复:
都一年多了,楼主,这个问题解决了么?

怎么计算日期的?! --------------------编程问答-------------------- 明明都两年多了!
--------------------编程问答-------------------- 这坟挖得... --------------------编程问答--------------------  [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public extern static IntPtr SetParent(IntPtr hChild, IntPtr hParent);
        [DllImport("user32.dll", EntryPoint = "FindWindow")]
        private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr hwnd = FindWindow(null, "ceshi");
            if (hwnd != IntPtr.Zero)
            {
                SetParent(hwnd, panel2.Handle);
            }
        }

经过亲自测试两个程序都是vs2008编写的winform,可以的。测试环境:vs2008 --------------------编程问答-------------------- 这是在干嘛 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 29 楼 sp1234 的回复:
明明都两年多了!


都一年多14个月了。

使用《Csdn收音机》截图功能,轻松制作图文并茂的文章! --------------------编程问答-------------------- 可以另起一个进程去运行窗体,并附上一些所运行着窗体需要的资源
另外你还要写一些保持同步的代码
我理解,当前的运行消息队列,与你要运行窗体的消息队列无法相互操作
work,notepad 微软自己做了这些工作(相互通信,保持消息同步) --------------------编程问答-------------------- 世界性难题 --------------------编程问答-------------------- Process去启动另一个程序,可以正确获取到这个程序的句柄 --------------------编程问答-------------------- mark   可用  但必须注意获取的窗口是有程序启动的  否则会挂掉  至少在win7下  估计是权限问题 --------------------编程问答-------------------- 一个没有分了的菜鸟,发贴纯粹是为了得分,谢谢楼主。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,