注:本文系由外文翻译而来,原文请见Hosting .exe applications into a dialog。
一篇关于在基于对话框应用中启动和嵌入.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许可之下。