CreateProcess创建进程后父子进程如何实现模态对话框的效果?高手请指点!

jixiang1983 2011-10-25 11:40:50
在主程序中要启用一个exe程序使用,当启动exe程序后,主程序不能被操作,直到启动的exe程序被关闭,点击主程序界面时,自动将焦点集中到exe程序上,效果类似主程序中打开模态对话框。 类似代码如下:

void CMainFrame::OnOpenExe( )
{
STARTUPINFO sui;
ZeroMemory(&sui,sizeof(STARTUPINFO));
sui.cb=sizeof(STARTUPINFO);

PROCESS_INFORMATION pi;
DWORD dwExitCode;
BOOL fSuccess = CreateProcess("C:\\Windows\\system32\\notepad.exe", "\"notepad.exe\" \"E:\\Buf2\\code.txt\"",NULL,NULL,TRUE,0,NULL,NULL,&sui,&pi);//启动记事本打开默认文件

if(fSuccess)
{
CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess,INFINITE);
GetExitCodeProcess(pi.hProcess, &dwExitCode);
CloseHandle(pi.hProcess);
...
}
}

当前在点击主程序界面时如同程序死掉,不能把焦点集中到notepad.exe上,没有达到模态对话框的效果,请高手指点!
...全文
328 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
你個臭鴨蛋 2011-12-13
  • 打赏
  • 举报
回复
在CreateProcess之后用WaitForSingleObject(pi.hProcess, INFINITE);
你個臭鴨蛋 2011-12-13
  • 打赏
  • 举报
回复
不知道LZ是否搞定了?我现在也想知道是怎么实现的,就是在调用CreateProcess之后具体怎么操作?希望能够分享一下经验,谢谢
jixiang1983 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chenjintaoxp 的回复:]
我最近的一个项目也涉及到这个问题了,不过我是在被启动的模块中,让它显示在最前面。
有时候问题正面不太好解决,可以换个方向想一下。
给你个建议。
[/Quote]
谢谢!可是我这里被启动的那个进程只有exe文件,没有原代码,不知在父进程中怎么控制它
请叫我涛哥0-0 2011-10-27
  • 打赏
  • 举报
回复
我最近的一个项目也涉及到这个问题了,不过我是在被启动的模块中,让它显示在最前面。
有时候问题正面不太好解决,可以换个方向想一下。
给你个建议。
jixiang1983 2011-10-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xianglitian 的回复:]
可以单步调试跟到DoMadol函数中参考一下他对主窗口的处理
我就不在这贴代码了
[/Quote]
DoMadol函数比较复杂,看了也太明白,而且DoMadol函数是操作自己,使自身一直处于焦点。现在要做的是使另一个子进程处于焦点状态,不知如何做,请指点!谢谢!
jixiang1983 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kyotrue 的回复:]
用MsgWaitForMultipleObjects,这样你才能处理主程序的界面消息。
[/Quote]
没用过MsgWaitForMultipleObjects,此处代码该如何写,能否说详细点,不胜感激!
jixiang1983 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 visualeleven 的回复:]
大致思路是这样,有点问题就是点击父窗口,会把父窗口带到前台来。这个你可能需要过滤一些消息
[/Quote]
谢谢部长的回复,只是我不知如何过滤消息,代码如何写,请指点一下!
kyotrue 2011-10-25
  • 打赏
  • 举报
回复
用MsgWaitForMultipleObjects,这样你才能处理主程序的界面消息。
向立天 2011-10-25
  • 打赏
  • 举报
回复
可以单步调试跟到DoMadol函数中参考一下他对主窗口的处理
我就不在这贴代码了
Eleven 2011-10-25
  • 打赏
  • 举报
回复
大致思路是这样,有点问题就是点击父窗口,会把父窗口带到前台来。这个你可能需要过滤一些消息
Eleven 2011-10-25
  • 打赏
  • 举报
回复
TCHAR szApp[] =  _T("Notepad");
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi = {0};

if(CreateProcess (NULL, szApp, NULL, NULL, FALSE, DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &si, &pi))
{
DEBUG_EVENT evt = {0};
while (EXIT_PROCESS_DEBUG_EVENT != evt.dwDebugEventCode)
{
if (WaitForDebugEvent(&evt, 100))
{
ContinueDebugEvent(evt.dwProcessId, evt.dwThreadId, DBG_CONTINUE);
}

MSG msg;
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if(WM_PAINT == msg.message)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
::SetForegroundWindow(GetSafeHwnd());
}

15,467

社区成员

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

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