Delphi SetParent 嵌入其他应用程序
[代码]Delphi实现窗体内嵌其他应用程序窗体
实现原理是启动一个应用程序,通过ProcessID得到窗体句柄,然后对其设定父窗体句柄为本程序某控件句柄(本例是窗体内一个Panel的句柄),这样就达成了内嵌的效果。
本文实现的是内嵌一个记事本程序,如下图:

在实现细节上需要注意几点:
- 为了美化程序的嵌入效果,需要隐藏其标题栏
 - 在外部窗体大小变化时,需要内嵌的窗体也随之变化大小
 - 外部程序退出时,内嵌的程序也要退出
 
下面是例子程序。新建窗体,上面放置一个Panel控件,名为pnlApp,然后按下面代码编写:
unit frmTestEmbedApp; | 
interface | 
uses | 
  Windows, | 
  Dialogs, | 
type | 
  TForm1class(TForm) | 
    pnlApp: | 
    procedure FormCreate(Sender: | 
    procedure FormClose(Sender:var Action: | 
    procedure FormResize(Sender: | 
  private | 
    { | 
  public | 
    { | 
  end; | 
var | 
  Form1: | 
  hWin:0; | 
implementation | 
{$R | 
type | 
  // | 
  PProcessWindow | 
  TProcessWindowrecord | 
    ProcessID: Cardinal; | 
    FoundWindow: | 
  end; | 
// | 
function EnumWindowsProc(Wnd: | 
var | 
  WndProcessID: Cardinal; | 
begin | 
  GetWindowThreadProcessId(Wnd, | 
  if WndProcessIDthen begin | 
    ProcWndInfo^.FoundWindow | 
    ResultFalse;                                    // | 
  end | 
  else | 
    ResultTrue;                                     // | 
end; | 
// | 
function GetProcessWindow(ProcessID: Cardinal): | 
var | 
  ProcWndInfo: | 
begin | 
  ProcWndInfo.ProcessID | 
  ProcWndInfo.FoundWindow0; | 
  EnumWindows(@EnumWindowsProc, Integer(@ProcWndInfo)); // | 
  Result.FoundWindow; | 
end; | 
// | 
function RunAppInPanel(const AppFileName: string;var WinHandle:Boolean; | 
var | 
  si: | 
  pi: | 
begin | 
  ResultFalse; | 
  // | 
  FillChar(si,0); | 
  si.cb | 
  si.wShowWindow | 
  if not CreateProcess(nil, PChar(AppFileName), nil, nil, true, | 
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil,then Exit; | 
  // | 
  WaitForInputIdle(pi.hProcess, 10000); | 
  // | 
  WinHandle.dwProcessID); | 
  if WinHandle0 then begin | 
    // | 
    Windows.SetParent(WinHandle, | 
    // | 
    SetWindowPos(WinHandle, 0, 0, 0, 0, 0,or SWP_NOZORDER); | 
    // | 
    SetWindowLong(WinHandle, | 
      and (not WS_CAPTION) and (not WS_BORDER) and (not WS_THICKFRAME)); | 
    ResultTrue; | 
  end; | 
  // | 
  CloseHandle(pi.hProcess); | 
  CloseHandle(pi.hThread); | 
end; | 
procedure TForm1.FormClose(Sender:var Action: | 
begin | 
  // | 
  if hWin0 then PostMessage(hWin,0, 0); | 
end; | 
procedure TForm1.FormCreate(Sender: | 
const | 
  App'C:\Windows\Notepad.exe'; | 
begin | 
  pnlApp.Align | 
  // | 
  if not RunAppInPanel(App,.Handle,then ShowMessage('App); | 
end; | 
procedure TForm1.FormResize(Sender: | 
begin | 
  // | 
  if hWin0 then MoveWindow(hWin, 0, 0,.ClientWidth,.ClientHeight, True); | 
end; | 
end. | 
这种方式也存在几个问题:
问题1:如果程序有Splash窗体先显示,则实际窗体无法内嵌,因为仅将Splash窗体的父窗体设定为本程序的控件句柄,后续窗体无法设定。
解决方法:可以通过轮询方式查询后续窗体,并设定其父窗体为本程序的控件句柄。
问题2:点击内嵌程序的窗体,则本程序的标题栏失去焦点
解决方法:不详。
问题3:点击内嵌程序的窗体,按下ALT+F4,则内嵌程序退出,仅留下本程序
解决方法:可以通过Hook方式拦截ALT+F4。
Delphi SetParent 嵌入其他应用程序的更多相关文章
- WPF中嵌入普通Win32程序的方法
		
公司现在在研发基于.Net中WPF技术的产品,由于要兼容旧有产品,比如一些旧有的Win32程序.第三方的Win32程序等等,还要实现自动登录这些外部Win32程序,因此必须能够将这些程序整合到我们的系 ...
 - 在winform嵌入外部应用程序
		
应朋友要求,需要将一个第三方应用程序嵌入到本程序WinForm窗口,以前在VB6时代做过类似的功能,其原理就是利用Windows API中FindWindow函数找到第三方应用程序句柄,再利用SetP ...
 - WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口)
		
原文 WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口) WPF 的 UI 逻辑只在同一个线程中,这是学习 WPF 开发中大家几乎都会学习到的经验.如果希望做不同线程 ...
 - 把任意的EXE嵌入到自己程序中
		
把任意的EXE嵌入到自己程序中 taoyuan19822008-08-24上传 Delphi把任意的EXE嵌入到自己程序中的程序 资源积分:0分 下载次数:327 资源类型:其他 资源大小:175 ...
 - Qt界面中嵌入其他exe程序的界面,使用Qt5
		
下面用一个小例子来演示如何在Qt的界面中嵌入其他exe程序的界面,最终效果如下图所示.本文参考了 http://blog.csdn.net/jiaoyaziyang/article/details/4 ...
 - Delphi 在任务栏隐藏程序图标
		
Delphi 在任务栏隐藏程序图标 方法一:1.修改工程文件中的“Application.MainFormOnTaskbar := True;”为“Application.MainFormOnTask ...
 - Delphi Excel导入 的通用程序转载
		
Delphi Excel导入 的通用程序 (-- ::)转载▼ 标签: it 分类: Delphi相关 步骤: 连excel(自己知道其格式,最好是没个字段在数据一一对应) 读excel数据,填入到数 ...
 - Delphi - Indy TIdHTTP方式创建程序外壳 - 实现可执行程序的自动升级
		
Delphi 实现可执行程序的自动升级 准备工作: 1:Delphi调用TIdHTTP方式开发程序,生成程序打包外壳 说明:程序工程命名为ERP_Update 界面布局如下: 代码实现如下: unit ...
 - C# SetParent将其他程序嵌入自己的程序
		
模块化的开发,将模块合并到一起的时候,遇到了Mdi不能添加到其它窗口下的问题. 分两种情况: 将mdi窗口A设成普通窗口B的子控件,需要将A的TopLevel设置成false,但是Mdi窗口的TopL ...
 
随机推荐
- DOS命令之at命令详解
			
AT命令是Windows XP中内置的命令,它也可以媲美Windows中的“计划任务”,而且在计划的安排.任务的管理.工作事务的处理方面,AT命令具有更强大更神通的功能.AT命令可在指定时间和日期.在 ...
 - Office 2010 打开文件后所有的格式成了时间的解决方法
			
最新不知道什么原因,每一个 Excel 文件打开后,时需的数据都成了时间格式. 而且改都改不了,改了后第二次打开又成了这个样子. 最后找到解决方法. 如下动画,将 [$F400] 数据格式删除就可以. ...
 - RCC 和 RTC
			
RCC是STM32的时钟控制器,可开启或关闭各总线的时钟,在使用各外设功能必须先开启其对应的时钟,没有这个时钟内部的各器件就不能运行.RTC是STM32内部集成的一个简单的时钟(计时用),如果不用就关 ...
 - 配置中心Server端
			
为什么需要统一配置中心 1.不方便维护.一个功能被多个人开发,如果其中一个人修改了配置文件,另外一个人测试之前的功能,准备使用之前的配置. 2.配置内容安全与权限.线上的配置是不会对开发公开,特别是数 ...
 - show master status, show slave status中的Executed_Gtid_Set
			
slave 如果server是slave节点,在server上执行show master staus与show slave status显示的Executed_Gtid_Set是一样的. slave也 ...
 - Apache Kafka监控之KafkaOffsetMonitor
			
转载自:http://www.cnblogs.com/Leo_wl/p/4564699.html 1.概述 前面给大家介绍了Kafka的背景以及一些应用场景,并附带上演示了Kafka的简单示例.然后, ...
 - javaweb下载中的一个问题
			
如果你发现,response头以及contentType都已经设置没错,但出现浏览器将下载的文件内容显示到新窗口 那么解决方案就是在请求的时候不要产生新的窗口
 - SDI工程时钟路径分析
			
SDI工程时钟路径分析 //------------- Receive Ports - RX Fabric Output Control Ports ------------- output rxou ...
 - HD-SDI制式学习
			
HD-SDI制式学习 1.资料来源(XAPP514) 2.HD-SDI相关知识 需要注意的是每一行的开始为EAV,序列依次为:EAV Blank Video 3.XYZ的格式 4.Line numbe ...
 - django 初始化 介绍 生命周期
			
安装好django,配置模板,静态文件 # 创建Django工程 django-admin startproject [工程名称] mysite - mysite # 对整个程序进行配置 - init ...