Waitforsingleobject работает при попытке открыть Notepad ++, но сразу возвращается с Firefox - PullRequest
0 голосов
/ 14 мая 2018

У меня есть следующий код, который открывает приложение с помощью CreateProcess и ждет его несколько секунд, а затем закрывает, если оно не было закрыто.Тот же код работает нормально в notepad ++, например, но не при попытке открыть 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, 64bit и VS2015

1 Ответ

0 голосов
/ 14 мая 2018

Ответ заключается в том, что процесс, который вы начали с CreateProcess, создал множество других процессов, а затем завершил работу.

Ваш WaitForSingleObject успешно завершен, и ваша программа завершается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...