Waitforsingleobject在尝试打开Notepad ++时有效,但会立即返回Firefox

时间:2018-05-14 09:36:40

标签: c++ windows winapi waitforsingleobject

我有以下代码使用CreateProcess打开一个应用程序并等待几秒钟然后如果它没有关闭则关闭它。例如,相同的代码在记事本++上运行正常,但在我尝试打开Firefox.exe时则不行。

BOOL CALLBACK SendWMCloseMsg(HWND hwnd, LPARAM lParam)
{
    //never gets called when opening Firefox.exe
    DWORD dwProcessId = 0;
    GetWindowThreadProcessId(hwnd, &dwProcessId);
    if (dwProcessId == lParam)
        SendMessageTimeout(hwnd, WM_CLOSE, 0, 0, SMTO_ABORTIFHUNG, 30000, NULL);
    return TRUE;
}


int main()
{
    STARTUPINFO         si;
    PROCESS_INFORMATION pi;

    memset(&si, 0, sizeof(si));
    memset(&pi, 0, sizeof(pi));

    si.cb = sizeof(si);

    WCHAR szFilename[] = L"C:\\Program Files\\Mozilla Firefox\\firefox.exe";
    if (CreateProcess(NULL,
        szFilename,
        NULL,
        NULL,
        FALSE,
        CREATE_DEFAULT_ERROR_MODE,
        NULL,
        NULL,
        &si,
        &pi))
    {
        CloseHandle(pi.hThread);
        WaitForInputIdle(pi.hProcess, INFINITE);

        auto a = WaitForSingleObject(pi.hProcess, 30000);
        if (a == WAIT_TIMEOUT)
        {
            EnumWindows(&SendWMCloseMsg, pi.dwProcessId);
            if (WaitForSingleObject(pi.hProcess, INFINITE) == WAIT_TIMEOUT)
            {
                //never gets here.
                TerminateProcess(pi.hProcess, 0);
            }
        }

        //a vlaue is 0 and it never gets in the if statement.
        CloseHandle(pi.hProcess);
    }
    return 0;
}

SendWMCloseMsg没有被调用,当我删除if语句并调用EnumWindows(&SendWMCloseMsg, pi.dwProcessId);时,它仍然找不到正确的processId。

我在使用此代码时遇到了什么问题以及如何解决此问题?

我使用的是Windows 10,64位和VS2015

1 个答案:

答案 0 :(得分:4)

答案是,您使用CreateProcess开始的流程创建了许多其他流程 - 然后退出。

您的WaitForSingleObject成功完成,您的计划结束。