从分离的线程管理子进程

时间:2014-08-20 14:15:09

标签: c++ multithreading winapi

我有一个主应用程序在一个单独的进程中运行另一个应用程序(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顺序似乎很好),并在主窗口终止时终止。

不幸的是,我现在有几个新问题。

  1. 子窗口的窗口大小限制为主窗口的大小。子窗口无法通过主窗口的边界而不会被切割。
  2. 我仍然可以与主窗口互动。
  3. 有没有办法解决这些问题?

0 个答案:

没有答案