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 ...
随机推荐
- auto_ptr & share_ptr & unique_ptr
Using auto_ptr, you don’t need think about the memory deallocation, but there are also many argument ...
- Scrapy 设置请求头
爬虫的过程有些网站设置反盗链,需要我们在请求头中添加下,修改settings.py文件中添加 DEFAULT_REQUEST_HEADERS = { 'Accept': 'text/html,appl ...
- HDU3501——欧拉函数裸题
给整数N(1 ≤ N ≤ 1000000000),求小于N的与N不互素的所有正整数的和. 思路:1.用欧拉函数求出小于N的与N互素的正整数的个数: 2.若 p 与 N 互素,则 N-p 必与 N 互素 ...
- 应用间通信方式HTTP和RPC
一.HTTP和RPC 1.Dobbo RPC框架 2.Sping Cloud 微服务架构下的一站式解决方案. 微服务直接使用的是 Http restful方式 二.SpringCloud中服务间两种 ...
- 【转】 Ubuntu在启动器添加程序快捷方式
转自: http://blog.csdn.net/walker0411/article/details/51555821 目录(?)[-] Ubuntu在启动器添加程序 eclipse快捷方式的创建 ...
- Windows Phone 常用资源
统计分析: 1. 友盟 http://www.umeng.com SDK: http://www.nuget.org/packages/UmengAnalytics/ 集成文档: http://dev ...
- oracle--合并行数据
select to_char(wmsys.wm_concat(patname)) as WaitPatientName from (SELECT * FROM (SELECT ROW_NUMBER() ...
- Azure ARM (18) 将Azure RM Manage Disk托管磁盘的Image,跨订阅迁移
<Windows Azure Platform 系列文章目录> 先挖一个坑,以后再埋. 最近遇到一个客户需求,客户使用了Azure RM Manage Disk托管磁盘,然后捕获镜像做成了 ...
- WCF类型共享技巧【转载】
调用过WCF服务的同学可能都会遇到这样的问题,同一个实体类型,不同的服务Visual Studio生成了不同的版本,例如Service1.User和Service2.User,对于C#来说,这是两个不 ...
- 恢复word中审阅选项卡
碰到在Word中,使用自定义功能区添加审阅选项卡,仍然不显示审阅选项卡 二个办法: 1.检查COM加载项,找出并从此禁用,如:iWebOffice2009.ocx 2.创建自定选项卡“审阅(自定义)” ...