MFC实现嵌入第三方exe程序到窗口中

⌚Time: 2022-09-26 22:51:42

👨‍💻Author: Jack Ge

将记事本notepad.exe嵌入到mfc的picturecontrol控件中

实现打开外部程序的函数


//program程序路径 args程序参数

HANDLE StartProcess(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))

        return hProcess;

}


将记事本程序嵌入到mfc图片控件中去


    HANDLE handle=StartProcess(L"C:\\Windows\\notepad.exe",L"");



    UpdateData(TRUE);  

    HWND hwnd = NULL;

    CRect rc;

    GetDlgItem(IDC_PIC1)->GetWindowRect(&rc);

    int nWidth = rc.Width();

    int nHeight = rc.Height();

    ScreenToClient(rc);

    while(!hwnd)

    {       

        hwnd =::FindWindow(L"Notepad",L"无标题 - 记事本");

    }

    if( hwnd)

    {

        //设置窗口属性

        LONG style=GetWindowLong(hwnd,GWL_STYLE);// 14CF 0000

        style &=~WS_CAPTION;

        style &=~WS_THICKFRAME;

        //style |=WS_CHILD;

        SetWindowLong(hwnd,GWL_STYLE,style);

        //设置父窗口

        ::SetParent(hwnd,this->m_hWnd);

        //::MoveWindow(hwnd, rc.left, rc.top, nWidth, nHeight, true); //将外部程序移到自自身窗口里       

        ::SetWindowPos(hwnd,HWND_TOP, rc.left, rc.top, nWidth, nHeight, SWP_SHOWWINDOW |SWP_HIDEWINDOW );

        // ::BringWindowToTop(hwnd);

        //Invalidate();

        //::UpdateWindow(hwnd);

        ::ShowWindow(hwnd,SW_SHOW);

    }

    

对于findwindow函数,他会根据窗口名字找到窗口句柄,第一个参数是窗口的类,一般可以省略不写,第二个参数是窗口名称。通过vs的工具,spy++,窗口搜索功能可以找到窗口的信息

实现效果