博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC++ 内嵌EXE
阅读量:5108 次
发布时间:2019-06-13

本文共 2688 字,大约阅读时间需要 8 分钟。

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 

转载于:https://www.cnblogs.com/kenter/archive/2011/12/17/2290965.html

你可能感兴趣的文章
Master选举原理
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
小别离
查看>>
微信小程序-发起 HTTPS 请求
查看>>
WPF动画设置1(转)
查看>>
基于node/mongo的App Docker化测试环境搭建
查看>>
秒杀9种排序算法(JavaScript版)
查看>>
Activiti入门 -- 环境搭建和核心API简介
查看>>
struts.convention.classes.reload配置为true,tomcat启动报错
查看>>
MySQL的并行复制多线程复制MTS(Multi-Threaded Slaves)
查看>>
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
PyQt5--EventSender
查看>>
Sql Server 中由数字转换为指定长度的字符串
查看>>
Java 多态 虚方法
查看>>
Unity之fragment shader中如何获得视口空间中的坐标
查看>>
万能的SQLHelper帮助类
查看>>
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
Html5 离线页面缓存
查看>>
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>