在对话框应用中嵌入一个.exe应用

注:本文系由外文翻译而来,原文请见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许可之下。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值