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

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

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

以下是部分代码:

 /// <summary>///将指定的程序嵌入指定的控件/// </summary>private voidEmbedProcess(){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;elsebreak;}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

转载于:https://www.cnblogs.com/habin/p/7815369.html

在winform嵌入外部应用程序相关推荐

  1. Qt嵌入外部EXE程序,并显示在主界面中!

    一.获取程序句柄以及类 打开Visual Studio 进行查询 二.QT调用程序 H文件 #ifndef VISUAL_H #define VISUAL_H#include <QWidget& ...

  2. Linux下 Qt界面程序嵌入另一个Qt界面程序_Qt应用嵌入外部进程窗口

    项目工程的实现,想要使用多个程序进行实现,在里面存在一定的调用的过程:调查的情况如下 Qt界面程序嵌入另一个Qt界面程序[Linux] Qt界面程序嵌入另一个Qt界面程序[Linux]_ptc321的 ...

  3. 【转】C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部

    PS:文末的附件已更新,这次我放到博客园里面了,不会弹出广告,放心下载,O(∩_∩)O谢谢! 这是最近在做的一个项目中提到的需求,把一个现有的窗体应用程序界面嵌入到自己开发的窗体中来,看起来就像自己开 ...

  4. C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部

    这是最近在做的一个项目中提到的需求,把一个现有的窗体应用程序界面嵌入到自己开发的窗体中来,看起来就像自己开发的一样(实际上--跟自己开发的还是有一点点区别的,就是内嵌程序和宿主程序的窗口激活状态问题) ...

  5. Winform嵌入Web网页-CefSharp组件

    Winform嵌入Web网页-CefSharp组件 WebBrower组件是基于本地操作系统的IE浏览器的,CSS解析和兼容性不太友好,一般我们不推荐使用.这里我们采用的是CefSharp这个开源组件 ...

  6. Qt Creator在外部应用程序上运行Valgrind工具

    Qt Creator在外部应用程序上运行Valgrind工具 在外部应用程序上运行Valgrind工具 在外部应用程序上运行Valgrind工具 Qt Creator集成了Valgrind代码分析工具 ...

  7. C# WinForm中获取当前程序运行目录的方法

    C# WinForm中获取当前程序运行目录的方法: "AppDomain.CurrentDomain.BaseDirectory":获取当前应用程序所在目录的路径,最后包含&quo ...

  8. Flex之嵌入外部资源

    1.MXML中嵌入外部资源: <?xml version="1.0" encoding="utf-8"?> <!-- embed\Button ...

  9. [码海拾贝 之TC] 呼叫外部应用程序或脚本

    前言 在Teamcenter Enterprise 的服务端开发中, 如何调用到外部的程序或是脚本. 一般, 呼叫外部的程序或脚本 在Java 中, 可以用这样的方式 Process child = ...

最新文章

  1. android实现底部弹出菜单,Android实现底部缓慢弹出菜单
  2. Discuz学习总结——部分bug解决方案
  3. 解决RuntimeError: cuda runtime error (30) : unknown error at /pytorch/aten/src/THC/THCGeneral.cpp:70N
  4. VTK:PolyData之ThinPlateSplineTransform
  5. 第 36 章 RRDTool
  6. mysql修改密码1820_mysql5.7初始化密码报错ERROR1820(HY000):YoumustresetyourpasswordusingALTERUSERstateme...
  7. 机器学习实战9-运行Tensorflow(california_housing数据集)
  8. 想为自己设置的软件加一个属于自己的图标吗?使用AWT_Swing_图标解决你的问题(源码解析)
  9. SQL Server 2012:SQL Server体系结构
  10. PSP3000高破解率傻瓜包!
  11. 前端Photoshop插件cutterman的下载和安装以及使用
  12. python绘图颜色代码_Python绘图的颜色设置
  13. VS2019+CUDA编程(流程)
  14. C语言练习题,从键盘输入一个字符,在给定的字符串中寻找该输入字符,若找到将该字符从字符串中删掉,并输出该字符串,没有找到给出提示信息“未找到”。
  15. Pull Request 到底是什么意思
  16. vivo 应用商店推荐系统探索与实践
  17. 分享一个VS写的PDF打印控件
  18. win10 系统锁屏壁纸的目录
  19. MichiGAN:Multi-Input-Conditioned Hair Image Generation for Portrait Editing---论文阅读笔记
  20. 超级!超级!超级好用的视频标注工具

热门文章

  1. python读取 application_python PyQt5.QtWidgets.QApplication类(sys.argv)(app应用对象类)...
  2. vim匹配特定的行并删除
  3. cclink 和发那科机器人_发那科 iB系列 | 机器人地装行走轴三大升级介绍
  4. python大一知识点串讲_python-前20天的着重知识点
  5. 关于c语言的字符常量
  6. olap与mysql_MySQL与OLAP:分析型SQL查询最佳实践探索
  7. 【存储知识学习】第三章磁盘原理与技术3.6磁盘控制器、驱动器控制电路和磁盘控制器驱动程序and3.7内部传输速率和外部传输速率--《大话存储》阅读笔记
  8. python开源聊天机器人ChatterBot——聊天机器人搭建、流程分析、源码分析
  9. (7)操作系统安全机制一
  10. shields 徽标_所有徽标看起来都一样