HANDLE handle; // process handle HWND apphwnd = NULL; // window handle BOOL find = FALSE; /* ************Global functions for hosting***************** */ // Function to enumerate all windows. int CALLBACK EnumWindowsProc(HWND hwnd, LPARAM param) { DWORD pID; DWORD TpID = GetWindowThreadProcessId(hwnd, &pID); // get process id if (TpID == (DWORD)param) { apphwnd = hwnd; // hwnd is the window handle return false; } return true; } // Functio to start a orocess and return the process handle 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)) { /* success */ for ( int i = 0; i < 150; i++) { Sleep( 30); // WaitForInputIdle(processInfo.hProcess, 10000); ::EnumWindows(&EnumWindowsProc, processInfo.dwThreadId); // Iterate all windows hProcess = processInfo.hProcess; if (apphwnd) // 找到相应的窗口 break; } } /* success */ return hProcess; } /* ******************************************************** */ // handle for host menu void CHostMSPaintDlg::OnActionHostmspaint() { CRect rect, rectWin, rectApp; GetClientRect(&rect); // get our dialog size into rect handle=StartProcess( " C:\\WINDOWS\\system32\\mspaint.exe ", ""); // Start ms paint if(apphwnd!=NULL) // check for window handle { ::SetParent(apphwnd,m_hWnd); // set parent of ms paint to our dialog. SetWindowLong(apphwnd, GWL_STYLE, GetWindowLong(apphwnd, GWL_STYLE) & ~WS_CAPTION); ::GetWindowRect(apphwnd, rectApp); GetWindowRect(rectWin); MoveWindow(rectWin.left, rectWin.top, rectWin.Width() + rectApp.Width() - rect.Width(), rectWin.Height() + rectApp.Height() - rect.Height(), true); // 调整自身窗口大小迎合外部程序的大小 GetClientRect(&rect); // get our dialog size into rect ::MoveWindow(apphwnd, rect.left, rect.top,rect.right, rect.bottom, true); // 将外部程序移到自自身窗口里 } else // no window for our process MessageBox( " 没有找到相应的窗口,程序没有正确启动 "); } // handle for kill process menu. void CHostMSPaintDlg::OnActionKillprocess() { TerminateProcess(handle, 0); // kill the process using handle // ::SetParent(apphwnd, NULL); // SetWindowLong(apphwnd, GWL_STYLE, GetWindowLong(apphwnd, GWL_STYLE) | WS_CAPTION); apphwnd = NULL; } BOOL CHostMSPaintDlg::DestroyWindow() { OnActionKillprocess(); return CDialog::DestroyWindow(); }
例子下载 http://files.cnblogs.com/kenter/MFC_ADD_EXE.zip