在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(); while (true)
{
P = FindWindow(null, title);//通过标题查找窗口句柄,当然也可以按class查找,如果需要查找子窗口需要FindWindowEx函数
Thread.Sleep();
if (P == IntPtr.Zero)
continue;
else
break;
}
try
{
// 将外部应用程序嵌入到本窗口
long ret = SetParent(P, this.panel1.Handle);
if (ret == )
{
MessageBox.Show("ErrorCode:"+ GetLastError().ToString());
} // 移除边框样式
SetWindowLong(new HandleRef(this, P), GWL_STYLE, WS_VISIBLE); //移动窗口
MoveWindow(P, , , this.Width, this.Height, true);
}
catch (Exception ex1)
{
Console.WriteLine(ex1.Message);
} }
主要参考来源:
http://blog.csdn.net/llddyy123wq/article/details/5624625
在winform嵌入外部应用程序的更多相关文章
- Winform嵌入其它应用程序
Options: using CommandLine; using System; using System.Collections.Generic; using System.Linq; using ...
- Winform运行外部控制台程序,并在程序结束后执行其他动作
ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = @"程序名"; psi.Arguments = @&qu ...
- C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部【转载】
这是最近在做的一个项目中提到的需求,把一个现有的窗体应用程序界面嵌入到自己开发的窗体中来,看起来就像自己开发的一样(实际上……跟自己开发的还是有一点点区别的,就是内嵌程序和宿主程序的窗口激活状态问题) ...
- 【转】C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部
PS:文末的附件已更新,这次我放到博客园里面了,不会弹出广告,放心下载,O(∩_∩)O谢谢! 这是最近在做的一个项目中提到的需求,把一个现有的窗体应用程序界面嵌入到自己开发的窗体中来,看起来就像自己开 ...
- WPF中嵌入普通Win32程序的方法
公司现在在研发基于.Net中WPF技术的产品,由于要兼容旧有产品,比如一些旧有的Win32程序.第三方的Win32程序等等,还要实现自动登录这些外部Win32程序,因此必须能够将这些程序整合到我们的系 ...
- C#中通过Process启动的外部第三方程序MainWindowHandle句柄为0
原文 C#中通过Process启动的外部第三方程序MainWindowHandle句柄为0 前几天遇到了一个在C#的winform程序中,启动一个第三方jar程序,并修改jar运行窗体的标题的问题. ...
- C# winform嵌入unity3D
最近做项目需要winform嵌入unity的功能,由于完全没接触过这类嵌入的于是在网上搜,有一种方法是UnityWebPlayer插件,也开始琢磨了一段时间,不过一会发现在5.4版本以后这个东西就被淘 ...
- 把任意的EXE嵌入到自己程序中
把任意的EXE嵌入到自己程序中 taoyuan19822008-08-24上传 Delphi把任意的EXE嵌入到自己程序中的程序 资源积分:0分 下载次数:327 资源类型:其他 资源大小:175 ...
- Qt界面中嵌入其他exe程序的界面,使用Qt5
下面用一个小例子来演示如何在Qt的界面中嵌入其他exe程序的界面,最终效果如下图所示.本文参考了 http://blog.csdn.net/jiaoyaziyang/article/details/4 ...
随机推荐
- REST 风格
- 软件测试——Peer Review(简介)
1. 同行评审的种类和对象 同行评审活动的关注点应该是工作产品中的缺陷,而不应该是工作产品的作者或者生产者,管理者也不应使用同行评审的结果去评价个人的行为. 同行评审的分类有很多种,自从IBM的Fag ...
- 转载:关于java关键字transient
今天在map源码中看到这个关键字 百度看一下 转载记录下 源文:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html 1. transient的作 ...
- os模块和sys模块,以及random模块
os模块 os模块是与操作系统交互的一个接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工 ...
- python正则表达式re库(自用)
经典例子: 1.由26个字母组成的字符串 ^[A-Za-z]+$ 2. 中国境内邮政编码 [1-9]\d{5} 3.IP地址 0-99:[1-9]?\d 100-199:1\d{2} 200-249: ...
- 在 html中怎么获取中的参数
参考:https://blog.csdn.net/xqhys/article/details/68486215 eg: window.location.href="/user/update? ...
- leetcode171
public class Solution { private int ConvertToC(char c) { ; switch (c) { case 'A': case 'a': rnt = ; ...
- WINFORM小列子参考
1.用树型列表动态显示菜单 密码:zx9t 二.Popup窗口提醒(桌面右下角出现) 密码:cjjo 三.台历 密码:nq4m 四.文件复制 密码:lsqj 五.进度条 密码:byti 六 ...
- ios 获得webview user-agent
UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectZero]; NSString *myUserAgent = [webView s ...
- Object-c 构造、析构函数
一.构造函数 在OC中凡是已init开头的函数我们都称之为构造函数,在声明构造函数的时候,不带参数的一般直接声明为“-(id)init”,带参数的一般声明为“-(id)initWith...”. @i ...