16,466
社区成员
发帖
与我相关
我的任务
分享
HANDLE hProcess;
HWND apphWnd = NULL;
int CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
DWORD pID;
DWORD tpID = GetWindowThreadProcessId(hwnd,&pID);
if(tpID == (DWORD)lParam)
{
apphWnd = hwnd;
return false;
}
return true;
}
HANDLE StartProcess(LPCTSTR program, LPCTSTR args)
{
HANDLE hPro = NULL;
PROCESS_INFORMATION processInfo;
STARTUPINFO startupInfo;
::ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
//设置进程创建时不显示窗口
//startupInfo.dwFlags = /*STARTF_USEPOSITION*/STARTF_USESHOWWINDOW;
startupInfo.dwFlags = STARTF_USEPOSITION;//STARTF_USESHOWWINDOW;
startupInfo.dwX = 600;
startupInfo.dwY = 900;
startupInfo.wShowWindow = SW_HIDE;
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))
{
//延迟0.5s,等待进程创建成功
Sleep(500);
while(true)
{
::EnumWindows(&EnumWindowsProc, processInfo.dwThreadId);//Iterate all windows
if(NULL != apphWnd)
break;
}
hPro = processInfo.hProcess;
}
return hPro;
}
if(apphWnd != NULL)
{
OnQuit();
}
CRect rect;
GetClientRect(&rect);//get our dialog size into rect
hProcess=StartProcess("我的工具.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, WS_VISIBLE);//eraze title of ms paint window.
//Positioning ms paint.
::MoveWindow(apphWnd, rect.left, rect.top,rect.right, rect.bottom, true);
//窗口重绘,(因创建exe时,设置为SW_HIDE,导致exe窗口会被父窗口覆盖一部分)
Invalidate();
::UpdateWindow(apphWnd);
::ShowWindow(apphWnd,SW_SHOW);
}
else
MessageBox("Cannot find Window");
OnQuit()
{
TerminateProcess(hProcess,0);
apphWnd = NULL;
}
BOOL CMsPaintInMyDlgDlg::GoMsPaint(char *path,BOOL bWait)
{
char pathexe[MAX_PATH];
strcpy(pathexe,"mspaint.exe");
strcat(pathexe,path);
STARTUPINFO sinfo;
PROCESS_INFORMATION pinfo;
memset (&sinfo,0,sizeof(STARTUPINFO));
sinfo.cb=sizeof(STARTUPINFO);
sinfo.dwFlags|=STARTF_USESHOWWINDOW;
sinfo.wShowWindow=SW_HIDE;
//BOOL fsuccess=0;
BOOL fsuccess=CreateProcess(NULL,//lpApplicationName
pathexe, //lpCommanderLine
NULL, //lpProcessAttributes
NULL, //lpThreadAttributes
FALSE, //bInheritHandles
NORMAL_PRIORITY_CLASS,//dwCreationFlags
NULL, //lpEnvironment
NULL, //lpCurrentDirectory
&sinfo, //lpStartupInfo
&pinfo); //lpProcessInformation
//
if(fsuccess)
{
Sleep(500);
CRect rect;
GetClientRect(&rect);//get our dialog size into rect
m_hPaint=::FindWindow("MSPaintApp",0);
::SetParent(m_hPaint,m_hWnd);//set parent of ms paint to our dialog.
::ShowWindow(m_hPaint,SW_SHOW);
::MoveWindow(m_hPaint, 0, 0, rect.Width(), rect.Height(), true);
::SetFocus(m_hPaint);
}
return(fsuccess);
}
HWND apphWnd = NULL;
HWND m_hPaint;
/////////////////////////////////////////////////////////////////////////////
// CXY2CK dialog
int CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
DWORD pID;
DWORD tpID = GetWindowThreadProcessId(hwnd,&pID);
if(tpID == (DWORD)lParam)
{
apphWnd = hwnd;
return false;
}
return true;
}
BOOL CXY2CK::GoMsPaint(char *path,BOOL bWait)
{
char pathexe[MAX_PATH];
strcpy(pathexe,"编辑器.exe");
strcat(pathexe,path);
STARTUPINFO sinfo;
PROCESS_INFORMATION pinfo;
memset (&sinfo,0,sizeof(STARTUPINFO));
sinfo.cb=sizeof(STARTUPINFO);
sinfo.dwFlags|=STARTF_USESHOWWINDOW;
sinfo.wShowWindow=SW_HIDE;
//BOOL fsuccess=0;
BOOL fsuccess=CreateProcess(NULL,//lpApplicationName
pathexe, //lpCommanderLine
NULL, //lpProcessAttributes
NULL, //lpThreadAttributes
FALSE, //bInheritHandles
NORMAL_PRIORITY_CLASS,//dwCreationFlags
NULL, //lpEnvironment
NULL, //lpCurrentDirectory
&sinfo, //lpStartupInfo
&pinfo); //lpProcessInformation
// ::SetParent(m_hPaint,m_hWnd);//set parent of ms paint to our dialog.
if(fsuccess)
{
Sleep(500);
CRect rect;
GetClientRect(&rect);//get our dialog size into rect
m_hPaint=::FindWindow("编辑器.exe",0);
::SetParent(m_hPaint,m_hWnd);//set parent of ms paint to our dialog.
::ShowWindow(m_hPaint,SW_SHOW);
::MoveWindow(m_hPaint, 0, 0, rect.Width(), rect.Height(), true);
::SetFocus(m_hPaint);
}
return(fsuccess);
}
CXY2CK::CXY2CK(CWnd* pParent /*=NULL*/)
: CDialog(CXY2CK::IDD, pParent)
{
//{{AFX_DATA_INIT(CXY2CK)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CXY2CK::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CXY2CK)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP*/
}
BEGIN_MESSAGE_MAP(CXY2CK, CDialog)
//{{AFX_MSG_MAP(CXY2CK)
// NOTE: the ClassWizard will add message map macros here
ON_BN_CLICKED(IDOK, OnOk)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CXY2CK message handlers
void CXY2CK::OnOk()
{
GoMsPaint("xy2.exe",FALSE);
}
麻烦你再看下,有没有错误
char pathexe[MAX_PATH];
strcpy(pathexe,"编辑器.exe");
strcat(pathexe,path);
STARTUPINFO sinfo;
PROCESS_INFORMATION pinfo;
memset (&sinfo,0,sizeof(STARTUPINFO));
sinfo.cb=sizeof(STARTUPINFO);
sinfo.dwFlags|=STARTF_USESHOWWINDOW;
sinfo.wShowWindow=SW_HIDE;
//BOOL fsuccess=0;
BOOL fsuccess=CreateProcess(NULL,//lpApplicationName
pathexe, //lpCommanderLine
NULL, //lpProcessAttributes
NULL, //lpThreadAttributes
FALSE, //bInheritHandles
NORMAL_PRIORITY_CLASS,//dwCreationFlags
NULL, //lpEnvironment
NULL, //lpCurrentDirectory
&sinfo, //lpStartupInfo
&pinfo); //lpProcessInformation
// ::SetParent(m_hPaint,m_hWnd);//set parent of ms paint to our dialog.
if(fsuccess)
{
Sleep(500);
CRect rect;
GetClientRect(&rect);//get our dialog size into rect
m_hPaint=::FindWindow("xy2.exe",0);
::SetParent(m_hPaint,m_hWnd);//set parent of ms paint to our dialog.
::ShowWindow(m_hPaint,SW_SHOW);
::MoveWindow(m_hPaint, 0, 0, rect.Width(), rect.Height(), true);
::SetFocus(m_hPaint);
}
return(fsuccess);
按钮调用 是这样写吗?
GoMsPaint("我的程序.exe",FALSE);