主要使用到核心函数:ShellExecute、FindWindow、SetParent。
首先,使用ShellExecute函数,运行exe程序;
然后,通过FindWindow找到exe程序的窗口句柄;
最后,使用SetParent,将exe程序设置为当前窗口的子窗口。
函数的介绍:
ShellExecute函数:ShellExecuteA/ShellExecuteW,字符集的设置不同,使用的函数相对改变。
HINSTANCE ShellExecuteA(
[in, optional] HWND hwnd,
[in, optional] LPCSTR lpOperation,
[in] LPCSTR lpFile,
[in, optional] LPCSTR lpParameters,
[in, optional] LPCSTR lpDirectory,
[in] INT nShowCmd );
参数介绍:
[in, optional] hwnd
类型:HWND
用于显示 UI 或错误消息的父窗口的句柄。 如果操作未与窗口关联,则此值可以为 NULL 。
[in, optional] lpOperation
类型: LPCTSTR
指向以 null 结尾的字符串(在本例中称为 谓词)的指针,指定要执行的操作。 可用谓词集取决于特定的文件或文件夹。 通常,对象的快捷菜单中可用的操作是可用的谓词。 通常使用以下谓词:
[in] lpFile
类型: LPCTSTR
指向 以 null 结尾的字符串的指针,该字符串指定要对其执行指定谓词的文件或对象。 若要指定 Shell 命名空间对象,请传递完全限定分析名称。 请注意,并非所有对象都支持所有谓词。 例如,并非所有文档类型都支持“print”谓词。 如果将相对路径用于 lpDirectory 参数,请不要对 lpFile 使用相对路径。
[in, optional] lpParameters
类型: LPCTSTR
如果 lpFile 指定可执行文件,则此参数是指向以 null 结尾的字符串的指针,该字符串指定要传递给应用程序的参数。 此字符串的格式由要调用的谓词决定。 如果 lpFile 指定文档文件, 则 lpParameters 应为 NULL。
[in, optional] lpDirectory
类型: LPCTSTR
指向 以 null 结尾的字符串的指针,该字符串指定操作) 目录的默认 (。 如果此值为 NULL,则使用当前工作目录。 如果在 lpFile 中提供了相对路径,请不要对 lpDirectory 使用相对路径。
[in] nShowCmd
类型: INT
指定应用程序在打开时如何显示应用程序的标志。 如果 lpFile 指定文档文件,则标志将直接传递给关联的应用程序。 由应用程序决定如何处理它。 它可以是在 ShowWindow 函数的 nCmdShow 参数中指定的任何值。
FindWindow函数:
HWND FindWindowA(
[in, optional] LPCSTR lpClassName,
[in, optional] LPCSTR lpWindowName );
参数介绍:
[in, optional] lpClassName
类型: LPCTSTR
由先前调用 RegisterClass 或 RegisterClassEx 函数创建的类名或类原子。 原子必须位于 lpClassName 的低序字中;高序字必须为零。
如果 lpClassName 指向字符串,则指定窗口类名。 类名可以是使用 RegisterClass 或 RegisterClassEx 注册的任何名称,也可以是任何预定义的控件类名称。
如果 lpClassName 为 NULL,它将查找其标题与 lpWindowName 参数匹配的任何窗口。
[in, optional] lpWindowName
类型: LPCTSTR
窗口名称 (窗口标题) 。 如果此参数为 NULL,则所有窗口名称都匹配。
SetParent函数:
HWND SetParent(
[in] HWND hWndChild,
[in, optional] HWND hWndNewParent );
参数介绍:
[in] hWndChild
类型:HWND
子窗口的句柄。
[in, optional] hWndNewParent
类型:HWND
新父窗口的句柄。 如果此参数为 NULL,桌面窗口将成为新的父窗口。 如果此参数 HWND_MESSAGE,则子窗口将成为 仅消息窗口。
最后,附上代码案例:
ShellExecute(m_hWnd, _T("open"), _T("......\\XXX.exe(exe的路径)"), NULL, NULL, SW_SHOW); //m_hWnd为当前窗口句柄
do
{
apphWnd = ::FindWindow(NULL, _T("exe的窗口标题")); //获取exe窗口句柄apphWnd
} while (apphWnd == NULL);
::SetParent(apphWnd,GetDlgItem(IDC_STATIC_A)->m_hWnd); //设置apphWnd的父窗口为当前窗口
//更改窗口的风格
LONG style=GetWindowLong(apphWnd,GWL_STYLE);// 14CF 0000
style &=~WS_CAPTION;
style &=~WS_THICKFRAME;
style |=WS_VISIBLE;
SetWindowLong(apphWnd, GWL_STYLE, style);//eraze title of ms paint window.
::MoveWindow(apphWnd, rectShow.left, rectShow.top,rectShow.right, rectShow.bottom, true);
Invalidate();
::UpdateWindow(apphWnd);
::ShowWindow(apphWnd,SW_SHOW);