关于MFC将exe嵌套到mfc窗口中的一些经验

主要使用到核心函数: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);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值