我有一个主应用程序在一个单独的进程中运行另一个应用程序(exe)。为避免混淆用户,新进程的应用程序窗口应该是我的主应用程序窗口的模态。
到目前为止,我尝试使用 ShellExecuteEx 运行我的应用程序,并等待 WaitForSingleObject 以完成该过程。这会导致主窗口冻结。因此,我将ShellExecuteEx调用放入主应用程序中的单独线程中。现在主窗口不再冻结,但对新用户交互做出响应。除非主应用程序已停止,否则子应用程序将继续运行。
如何让子进程模态到我的主应用程序?
这里是我从主应用程序中的单独线程调用的代码:
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = L"";
ShExecInfo.lpFile = L"LicenseViewer.exe";
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
LPDWORD returncode;
GetExitCodeProcess(ShExecInfo.hProcess,returncode);
int value = static_cast<int>(*returncode);
修改
正如AdrianMcCarthy所建议的那样,我调用了SetParent()来将我的主窗口设置为子进程窗口的父窗口。我使用此处的解决方案postet得到了子进程的窗口句柄:How to get hWnd of window opened by ShellExecuteEx.. hProcess? 子窗口现在位于主窗口的前面(z顺序似乎很好),并在主窗口终止时终止。
不幸的是,我现在有几个新问题。
有没有办法解决这些问题?