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

Winform中嵌入别的程序界面的问题

我用SetParent的方法实现了Winform中嵌入别的程序界面。
主要是

            Process process = new Process();
            process.StartInfo.FileName = fileName;
            process.Start();
            IntPtr h = FindWindow(null, winName);
            SetParent(h, this.panel1.Handle);
            ShowWindow(h.ToInt32(), SW_SHOW);

具体可以参考这个网页
http://topic.csdn.net/u/20090226/17/369adba8-bb8f-41d3-b65d-c0e7a8697087.html
其中fileName和winName分别是程序启动位置和窗口名字,譬如
fileName = D:\Program Files\IDM Computer Solutions\UltraEdit\uedit32.exe
winName = UltraEdit
我见过一个可以嵌入别的程序界面的软件A,对比了一下,比我现在的有三个优势
1. 我的软件对有些软件嵌入不了界面,但这个软件A可以
2. 我的软件嵌入别的程序需要fileName和winName,但软件A只需要fileName.
3. 我的软件嵌入别的程序界面后,别的程序标题栏(就是窗口最顶端的部分包括左边标题和右边关闭按钮)还存在,但软件A没有这个问题。

我想问一下软件A是不是用了更好的集成方式。其中软件A也是C#winform编的,但我没有源代码,多谢
  --------------------编程问答-------------------- LZ 不能沉底了 --------------------编程问答-------------------- 软件A,具体是什么软件,可以说说吗? --------------------编程问答-------------------- 我后来又想了一下,软件A有可能和我用的是同样的技术,只不过更精细一点。
关于第2点优势,即只需要进程名而不需要窗体名,是因为可以通过进程名来获取窗体名。
譬如: http://topic.csdn.net/t/20050726/19/4169736.html
第1点优势是因为如果通过进程名来获取窗体名那么就可以集成更多的软件。
第3点应该是设置被嵌入程序的窗体属性就行了.具体还要调研一下。
如果谁做过这方面工作,能说不下最好了。 --------------------编程问答-------------------- 使用process创建可以获得mainwindowhandle;
第一条和第二条解决了;
第三条,需要setwindowlong()函数,自己修改窗体的风格,去除边框和标题栏,同时子窗体需要注意重绘部分 --------------------编程问答--------------------
引用 4 楼 feixuyue 的回复:
使用process创建可以获得mainwindowhandle;
第一条和第二条解决了;
第三条,需要setwindowlong()函数,自己修改窗体的风格,去除边框和标题栏,同时子窗体需要注意重绘部分

恩,用setwindowlong搞定了标题栏。
我用的是http://topic.csdn.net/u/20090820/11/1b30a514-17e7-403a-ae07-70c81e6ced47.html
中的方法 --------------------编程问答--------------------
引用 4 楼 feixuyue 的回复:
使用process创建可以获得mainwindowhandle;
第一条和第二条解决了;
第三条,需要setwindowlong()函数,自己修改窗体的风格,去除边框和标题栏,同时子窗体需要注意重绘部分

恩,用setwindowlong搞定了标题栏。
我用的是http://topic.csdn.net/u/20090820/11/1b30a514-17e7-403a-ae07-70c81e6ced47.html
中的方法
不过里面提到的369164288这个数怎么来的我也没弄清楚 --------------------编程问答-------------------- 路过,学习了 --------------------编程问答--------------------
引用 4 楼 feixuyue 的回复:
使用process创建可以获得mainwindowhandle;
第一条和第二条解决了;
第三条,需要setwindowlong()函数,自己修改窗体的风格,去除边框和标题栏,同时子窗体需要注意重绘部分

我试了一下Process.MainWindowHandle,没有成功。
发现得到的句柄和FindWindow得到的不一样。
搜了一下网上,大部分还是用Windows Api的。 --------------------编程问答-------------------- 我要做个标记 --------------------编程问答-------------------- 顶起来,学习。 --------------------编程问答-------------------- 用Windows API获得进程对应窗体句柄时有两种方法:
http://zwkufo.blog.163.com/blog/static/258825120104717513/
最大的区别是用GetParent() == NULL还是 GetWindow(hWnd, GW_OWNER) == NULL 来判断是否是主窗体
我测试了一下,这两种方法都有错,但GetWindow更准一点。可能还需要两种结合起来判断。
Ref:
http://blog.sina.com.cn/s/blog_5e83fce60100r0y5.html
http://www.cctry.com/thread-21324-1-1.html
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,