我尝试使用ShellExecuteEx
打开应用程序并使用WaitForInputIdle
等待它,这对某些应用程序有效,但对于某些应用程序,即iexplorer.exe
它不会。 WaitForInputIdle
立即返回。我知道它不能按预期工作
SHELLEXECUTEINFO shellExecuteInfo;
shellExecuteInfo.cbSize = sizeof(SHELLEXECUTEINFO);
shellExecuteInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
shellExecuteInfo.hwnd = NULL;
shellExecuteInfo.lpVerb = NULL;
shellExecuteInfo.lpFile = reinterpret_cast<const wchar_t*>(app->applicationFile.utf16());
shellExecuteInfo.lpParameters = NULL;
shellExecuteInfo.lpDirectory = NULL;
shellExecuteInfo.nShow = SW_SHOWNORMAL;
shellExecuteInfo.hInstApp = NULL;
if(!ShellExecuteEx(&shellExecuteInfo)) {
log(QString("Can not start application %1 with path %2. Last error is %3")
.arg(app->buttonName)
.arg(app->applicationFile)
.arg(GetLastError()));
return ProcessWindowsInfo();
}
//Waiting for 30 seconds
DWORD result = WaitForInputIdle(shellExecuteInfo.hProcess, 30 * 1000);
if(result != 0) {
//report error and return
return ProcessWindowsInfo();
}
ProcessWindowsInfo info(GetProcessId(shellExecuteInfo.hProcess));
if(!findWindows(info)) {
return info;
}
if(info.windows.empty()) {
log(QString("Can not find windows for %1 with path %2")
.arg(app->buttonName)
.arg(app->applicationFile));
return info;
}
resizeWindows(app, info);
showWindows(app, info.windows);
return info;
}
我在StackOverflow中看到了其他问题,例如this one。
我不是win32的开发人员,因此很难看到如何使用CBT hook或WinEvents来解决这个问题。 如果有人能指出解决这个问题的最佳方法。
还有this one,但我又如何获得刚刚开始的应用程序的句柄?
另外,我应该使用ShellExecuteEx
还是CreateProcess
,这会影响查找已打开的应用程序的能力吗?