首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

2012-01-12 
CreateProcess创建进程后父子进程如何实现模态对话框的效果?高手请指点!在主程序中要启用一个exe程序使用,

CreateProcess创建进程后父子进程如何实现模态对话框的效果?高手请指点!
在主程序中要启用一个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上,没有达到模态对话框的效果,请高手指点!


[解决办法]

C/C++ code
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());    }
[解决办法]
可以单步调试跟到DoMadol函数中参考一下他对主窗口的处理
我就不在这贴代码了
[解决办法]
用MsgWaitForMultipleObjects,这样你才能处理主程序的界面消息。
[解决办法]
我最近的一个项目也涉及到这个问题了,不过我是在被启动的模块中,让它显示在最前面。
有时候问题正面不太好解决,可以换个方向想一下。
给你个建议。

热点排行