WaitForInputIdle替代方法

时间:2018-05-10 10:01:22

标签: c++ qt winapi mfc atl

我尝试使用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,这会影响查找已打开的应用程序的能力吗?

0 个答案:

没有答案