CreateProcess创建进程后父子进程怎么实现模态对话框的效果?高手请指点
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上,没有达到模态对话框的效果,请高手指点!
------解决方案--------------------
在主程序中要启用一个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,这样你才能处理主程序的界面消息。
------解决方案--------------------
我最近的一个项目也涉及到这个问题了,不过我是在被启动的模块中,让它显示在最前面。
有时候问题正面不太好解决,可以换个方向想一下。
给你个建议。