shellexecute 打开的窗体,如何成为模态对话框!

vatajoan 2016-02-17 11:32:39
shellexecute 打开一个程序,该程序只有一个窗体,如何让这个窗体成为模态对话框,也就是阻止当前程序的执行,等到这个模态对话框关闭之后,再执行下去 。
...全文
197 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dobzhansky 2016-02-17
  • 打赏
  • 举报
回复
block parent process ? busy waiting ? 这需要在父进程中模拟出一个模态的消息循环来
schlafenhamster 2016-02-17
  • 打赏
  • 举报
回复 1

// by creating process ***********************************
BOOL OpenExe(char *path,BOOL bWait)
{
   STARTUPINFO sinfo;
   PROCESS_INFORMATION pinfo;
   memset (&sinfo,0,sizeof(STARTUPINFO));
   sinfo.cb=sizeof(STARTUPINFO);
   sinfo.dwFlags|=STARTF_USESHOWWINDOW;
   sinfo.wShowWindow=SW_SHOWNORMAL;//SW_SHOW;// SW_SHOWDEFAULT;
   //BOOL fsuccess=0;
   BOOL fsuccess=CreateProcess(NULL,//lpApplicationName
	   path,    //lpCommanderLine
	   NULL,    //lpProcessAttributes
	   NULL,    //lpThreadAttributes
	   FALSE,   //bInheritHandles
	   NORMAL_PRIORITY_CLASS,//dwCreationFlags
	   NULL,    //lpEnvironment
	   NULL,    //lpCurrentDirectory
	   &sinfo,   //lpStartupInfo
	   &pinfo);   //lpProcessInformation
   // wait for NotePad finishes
   if(fsuccess)
   {
	   HANDLE hProcess=pinfo.hProcess;
	   CloseHandle(pinfo.hThread);// close thread at once
	   if (bWait)
	   {
		   if (WaitForSingleObject(hProcess,INFINITE)!=WAIT_FAILED)
		   {
			   DWORD dwExitCode;
			   GetExitCodeProcess(hProcess,&dwExitCode);
			   if (dwExitCode==STILL_ACTIVE) AfxMessageBox("EXE STill ALIVE");
		   }
	   }
	   CloseHandle(pinfo.hProcess);
   }
   return(fsuccess);
}
注意: if (dwExitCode==STILL_ACTIVE) AfxMessageBox("EXE STill ALIVE");
孤客天涯 2016-02-17
  • 打赏
  • 举报
回复 1

SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "c:\\MyProgram.exe";
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
或:
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
if(CreateProcess("c:\\winnt\\notepad.exe", NULL,
     NULL,NULL,FALSE,0,NULL,
     NULL,&StartupInfo,&ProcessInfo))
{
     WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
     CloseHandle(ProcessInfo.hThread);
     CloseHandle(ProcessInfo.hProcess);
}  
else
{
     MessageBox("The process could not be started...");
}

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧