在winform嵌入外部应用程序

应朋友要求,需要将一个第三方应用程序嵌入到本程序WinForm窗口,以前在VB6时代做过类似的功能,其原理就是利用Windows API中FindWindow函数找到第三方应用程序句柄,再利用SetParent函数,将该句柄设置为本窗口的子窗口。

网上搜索大部分都是利用System.Diagnostics.Process获取外部应用程序的MainWindowHandle,貌似以前的COM应用程序可以,在Win10下调用Process.MainWindowHandle会提示“应用程序已退出”,也就是获取不到应用程序句柄。于是转换思路,利用FindWindow查找窗口句柄,测试成功。

但是需要注意的是,有些第三方应用程序对访问权限要求高,需要“以管理员身份运行"/bin/debug"下的exe文件才能成功嵌入,代码调试无效,调试模式调用SetParent会返回-5错误。

以下是部分代码:

 /// <summary>
        /// 将指定的程序嵌入指定的控件
        /// </summary>
        private void EmbedProcess()
        {

            string title = System.Configuration.ConfigurationManager.AppSettings["Title"];//要查找的外部应用程序窗口标题

            IntPtr P = new IntPtr(0);

            while (true)
            {
                P = FindWindow(null, title);//通过标题查找窗口句柄,当然也可以按class查找,如果需要查找子窗口需要FindWindowEx函数
                Thread.Sleep(100);
                if (P == IntPtr.Zero)
                    continue;
                else
                    break;
            }
            try
            {
                // 将外部应用程序嵌入到本窗口
                long ret = SetParent(P, this.panel1.Handle);
                if (ret == 0)
                {
                    MessageBox.Show("ErrorCode:"+ GetLastError().ToString());
                }

                // 移除边框样式
                SetWindowLong(new HandleRef(this, P), GWL_STYLE, WS_VISIBLE);

                //移动窗口
                MoveWindow(P, 0, 0, this.Width, this.Height, true);
            }
            catch (Exception ex1)
            {
                Console.WriteLine(ex1.Message);
            }

        }

点击这里下载源码

主要参考来源:

  http://blog.csdn.net/llddyy123wq/article/details/5624625

时间: 2024-10-09 13:05:31

在winform嵌入外部应用程序的相关文章

[转]嵌入字体到程序 Winform C#

http://www.cnblogs.com/top5/archive/2011/06/20/2084942.html 程序安装字体或直接调用非注册字体[c#] 1.安装字体 //程序直接将字体文件安装的系统中. 函数声明: [DllImport("kernel32.dll", SetLastError = true)] static extern int WriteProfileString(string lpszSection, string lpszKeyName, string

141107●Winform拖动无边框窗口、播放音频、启动外部exe程序

鼠标拖动无边框窗口 1. //鼠标拖动 Point downpoint = new Point(); //事件,鼠标按下,获取当前坐标 private void panel1_MouseDown(object sender, MouseEventArgs e) { downpoint.X = -e.X; downpoint.Y = -e.Y; } //事件,鼠标移动,赋值新坐标 private void panel1_MouseMove(object sender, MouseEventArgs

WPF中嵌入普通Win32程序的方法

公司现在在研发基于.Net中WPF技术的产品,由于要兼容旧有产品,比如一些旧有的Win32程序.第三方的Win32程序等等,还要实现自动登录这些外部Win32程序,因此必须能够将这些程序整合到我们的系统中来,让使用者看起来它们好像是一个程序. 在MSDN中有专门的章节提到了在WPF中嵌入Win32控件的办法,那就是使用 HwndHost ,只要把 Win32控件的句柄传递给 HwndHost 就可以了.MSDN中的例子演示的都是在同一个进程内创建的 Win32控件,我一开始认为只要通过FindW

把任意的EXE嵌入到自己程序中

把任意的EXE嵌入到自己程序中 taoyuan19822008-08-24上传 Delphi把任意的EXE嵌入到自己程序中的程序 资源积分:0分 下载次数:327 资源类型:其他 资源大小:175KB 资源得分: (42位用户参与评分) 把任意的EXE嵌入到自己程序中 进入下载页 收藏(1) 评论(14) 举报 VIP下载  免积分60元/年(1200次) 相关推荐 把任意的EXE嵌入到自己程序中 把任意的EXE嵌入到自己程序中 您可能还需要 Web程序设计 ...简单的C#宿...matlab

C#中通过Process启动的外部第三方程序MainWindowHandle句柄为0

原文 C#中通过Process启动的外部第三方程序MainWindowHandle句柄为0 前几天遇到了一个在C#的winform程序中,启动一个第三方jar程序,并修改jar运行窗体的标题的问题. 大体的需求就是上面说明的那样,下面是当初设想的思路和实现代码. STEP1 // 根据jar文件的路径,启动该jar Process p = Process.Start(jarfilePath); STEP2 // 引用WindowsAPI中SetWindowText的声明 [System.Runt

(014)XHTML文档之嵌入外部内容

XHTML文档之嵌入外部内容 页面上的大多数内容都是XHTML文档的一部分.但经常会有需要嵌入图像.java applet.Flash动画或QuickTime视频等外部内容的时候.这些文件必须与文档分开保存,但可以在XHTML标记代码中引用它们,让浏览器将它们显示在网页上. 一.object元素 行内元素object在XHTML文档中嵌入一个外部的文件或某种类型的媒体.许多对象的数据格式都是Web浏览器不能处理的,需要使用插件应用程序来呈现.可以用object向页面中添加图像,但使用行内元素im

最新动态:开源项目 ionic3-awesome — 实现iframe嵌入外部网页

项目地址:https://github.com/alex-0407/ionic3-awesome 从零开始搭建一个ionic3 app,集成更多通用功能,通用组件. 让ionic开发more and more easy! 项目预览: ionic3-awesome 已完成内容: 基本框架搭建 页面懒加载 页面跳转 带logo的二维码生成组件,支持变换样式 多主题 九宫格 iframe嵌入外部网页 Todo: 多语言 通讯录 自定义扫一扫(二维码) 更多组件 更多功能 项目地址:https://gi

windows下调用外部exe程序 SHELLEXECUTEINFO

本文主要介绍两种在windows下调用外部exe程序的方法: 1.使用SHELLEXECUTEINFO 和 ShellExecuteEx SHELLEXECUTEINFO 结构体的定义如下: 1 typedef struct _SHELLEXECUTEINFO { 2 DWORD cbSize; 3 ULONG fMask; 4 HWND hwnd; 5 LPCTSTR lpVerb; 6 LPCTSTR lpFile; 7 LPCTSTR lpParameters; 8 LPCTSTR lpD

Winform使用外部浏览器解决webbrowser问题

对于还是一个菜鸟的我,在最近自己接手了个项目,搞的自己也是醉了,身边也有没大神的现场指导,只能靠度娘和谷歌的大力帮助,要不然这么个小项目可定现在还交不了,不过在这过程种也确确实实学到了不少东西,我先说说在winform中嵌入浏览器的问题.在winform嵌入浏览器,其实winform中有自己的控件-----WebBrowser控件,对于这个控件的使用,大家可以点击WebBrowser查看很详细的介绍以及使用方法,但是我想说的使用这个控件传递参数或是使用ip访问我是不会的,要是大家有会的,还请告知