在对话框应用中嵌入一个.exe应用
2015-03-27 18:36
92 查看
注:本文系由外文翻译而来,原文请见Hosting .exe applications into a dialog。
一篇关于在基于对话框应用中启动和嵌入.exe应用的文章
例程下载-27.0KB
1. 声明两个需要的变量
2. 用CreateProcess启动需要打开的.exe应用
3. 写一个回调函数来获得处理窗口的句柄HWND
4. 给.exe应用设置父窗口
5. 设置.exe应用窗口的位置
这里我们用CreateProcess启动进程。
函数WaitForInputIdle将暂停一个线程的执行,直到相应的进程完成初始化工作。通过把句柄传递给每个窗口,并反过来给到一个用户定义的回调函数中去,函数EnumWindows枚举屏幕上所有顶层窗口。EnumWindows函数一直运行直到最后一个顶层窗口被列举出来,或者回调函数返回FALSE。
我们的回调函数将会获取新进程窗口的句柄HWND。返回的句柄hprocess能被用来终止进程。
函数GetWindowThreadProcessId检索创建了特定窗口线程的id。apphwnd变量保存了新建窗口的句柄。
如果有必要,我们可以利用下面这个函数移除.exe窗口的标题栏。
GetClientRect函数将会获得我们对话框窗口的大小尺寸。MoveWindow函数将会把.exe应用窗口移到我们的对话框中去。
一篇关于在基于对话框应用中启动和嵌入.exe应用的文章
例程下载-27.0KB
介绍
这是个讲述如何嵌入一个.exe应用到对话框中去的简单应用。相同的应用可以在C#中使用,点击这里。但是如果我们想在VC++ 6.0实现这个目的,就有一点点的不一样。我试图在不同网站中找到VC++ 6.0下相关的例子,但却没有找到,最终我决定自己来完成这项工作。过程
基本的步骤如下:1. 声明两个需要的变量
2. 用CreateProcess启动需要打开的.exe应用
3. 写一个回调函数来获得处理窗口的句柄HWND
4. 给.exe应用设置父窗口
5. 设置.exe应用窗口的位置
具体实现
步骤1:声明两个变量
你必须先声明以下变量:HWND apphwnd; HANDLE handle;
步骤2:用CreateProcess函数启动.exe应用
下面这个函数将会完成这个任务,并返回进程的句柄HANDLE StartNewProcess(LPCTSTR program, LPCTSTR args) { HANDLE hProcess = NULL; PROCESS_INFORMATION processInfo; STARTUPINFO startupInfo; ::ZeroMemory(&startupInfo, sizeof(startupInfo)); startupInfo.cb = sizeof(startupInfo); if(::CreateProcess(program, (LPTSTR)args, NULL, // process security NULL, // thread security FALSE, // no inheritance 0, // no startup flags NULL, // no special environment NULL, // default startup directory &startupInfo, &processInfo)) { /* success */ Sleep(5000);//wait for the window of exe application created ::EnumWindows(&EnumWindowsProc, processInfo.dwThreadId); hProcess = processInfo.hProcess; } /* success */ return hProcess;//Return HANDLE of process. }
这里我们用CreateProcess启动进程。
函数WaitForInputIdle将暂停一个线程的执行,直到相应的进程完成初始化工作。通过把句柄传递给每个窗口,并反过来给到一个用户定义的回调函数中去,函数EnumWindows枚举屏幕上所有顶层窗口。EnumWindows函数一直运行直到最后一个顶层窗口被列举出来,或者回调函数返回FALSE。
我们的回调函数将会获取新进程窗口的句柄HWND。返回的句柄hprocess能被用来终止进程。
TerminateProcess(handle,0);
步骤3:写一个回调函数来获取进程窗口的句柄HWND
为了找到我们的.exe应用窗口的句柄HWND,本步骤很重要。我们可以把这个窗口句柄用到不同的函数中去,如SetParent,MoveWindow等。int CALLBACK EnumWindowsProc(HWND hwnd, LPARAM param) { DWORD pID; DWORD TpID = GetWindowThreadProcessId(hwnd, &pID); if (TpID == (DWORD)param) { apphwnd=hwnd; return false; } return true; }
函数GetWindowThreadProcessId检索创建了特定窗口线程的id。apphwnd变量保存了新建窗口的句柄。
步骤4:为.exe应用设置父窗口
此时我们设置.exe应用窗口的父窗口。父窗口是我们的对话框应用窗口。::SetParent(apphwnd,m_hWnd);
如果有必要,我们可以利用下面这个函数移除.exe窗口的标题栏。
::SetWindowLong(apphwnd, GWL_STYLE, WS_VISIBLE);
步骤5:设置.exe窗口位置
这个可以用下面的代码实现:CRect rect; GetClientRect(&rect); ::MoveWindow(apphwnd, rect.left, rect.top,rect.right, rect.bottom, true);
GetClientRect函数将会获得我们对话框窗口的大小尺寸。MoveWindow函数将会把.exe应用窗口移到我们的对话框中去。
备注
注意到调用函数StarNewProcess后,我们只能进行步骤4和5操作,并且应该在对话框项目中完成。历史
2007年5月9日——原始版本发布许可声明
这篇文章及相关源码和文件在协议CPOL许可之下。相关文章推荐
- 为你的Java应用嵌入一个功能强大的文字编辑器
- 对话框嵌入到对话框 或者:窗口嵌入到窗口,一个窗口嵌入到另一个窗口
- 在一个win Forms应用中嵌入以及播放WAV音频文件
- 怎样在对话框上做一个“应用”按钮
- 怎样在对话框上做一个“应用”按钮
- 原创vc: 对话框嵌入到对话框 或者:窗口嵌入到窗口,一个窗口嵌入到另一个窗口
- 在一个win Forms应用中嵌入以及播放WAV音频文件(翻译五)
- 现在很多的手机应用,都可能会直接嵌入一个web页面。这样做的好处:一个是功能更新方便,维护起来容易,只需要维护服务器的页面即可,不需要更新客户端;另一个是功能通用,不仅Android可以用,iOS也可
- 对话框嵌入到对话框 或者:窗口嵌入到窗口,一个窗口嵌入到另一个窗口
- 【转】为你的Java应用嵌入一个功能强大的文字编辑器
- 对话框嵌入到对话框 或者:窗口嵌入到窗口,一个窗口嵌入到另一个窗口
- 为你的Java应用嵌入一个功能强大的文字编辑器
- 为你的Java应用嵌入一个功能强大的文字编辑器
- Android应用:使用Activity实现一个对话框
- (1):创建一个基本的Silverlight应用
- simple-spa 一个简单的单页应用实例
- Android 如何监听返回键,弹出一个退出对话框
- 用MDA和传统方法开发一个三层架构应用的对比
- 一位程序员的一个LBS应用的想法
- 观察者模式生活中的一个应用