Как отловить сообщение о выходе из другого процесса? - PullRequest
1 голос
/ 22 ноября 2010

Я хочу "прослушать" какое-то другое приложение и решить, что делать после его завершения.

Как?

Редактировать: Обе программы запущенына том же компьютере, и я хочу знать, когда я закрою другую программу.А затем выполните действие в другой программе.Я не могу изменить другой программный код.Я могу или не могу запустить приложение B из приложения A. Я мог определить приложение B по его полному пути к exe.

Ответы [ 4 ]

5 голосов
/ 22 ноября 2010

Как пишет Abyx, WaitForSingleObject (или, возможно, WaitForMulipleObjects) - это нужная вам функция API.

  1. Создать событие
  2. Запустить (рабочий) поток
  3. Передать дескриптор события в поток -> HANDLE1
  4. Получить дескриптор процесса, который будет отслеживаться. См. Как я могу получить дескриптор процесса по его имени в C ++? -> HANDLE2
  5. В вашем потоке вызовите функцию WaitForMulipleObjects и дождитесь двух дескрипторов.
  6. Если HANDLE2 срабатывает, делайте все, что захотите ... и, возможно, завершите поток.
  7. Если HANDLE1 срабатывает, оставьте нить. Это для изящного завершения вашего приложения: перед выходом из основного потока (GUI) вы устанавливаете событие.
4 голосов
/ 22 ноября 2010

WaitForSingleObject(hProcess, INFINITE);

1 голос
/ 22 ноября 2010

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

WaitForSingleObject(pi.hProcess, INFINITE);

Если процесс, завершение которого выхотите подождать, запускается до того, как вы должны найти идентификатор процесса dwProcessId процесса, а затем выполните следующие действия:

HANDLE hProcess = OpenProcess (SYNCHRONIZE, FALSE, dwProcessId);
WaitForSingleObject(hProcess, INFINITE);

Поиск идентификатора процесса может осуществляться различными способами, в зависимости от того, какую информацию вы знаетео процессе и о том, сколько экземпляров процесса может быть запущено одновременно.

Например, если вы знаете имя файла процесса, который в данный момент выполняется, вы можете использовать EnumProcesses, OpenProcess и GetProcessImageFileName.Вот соответствующий код в упрощенном виде:

#include <Windows.h>
#include <stdio.h>
#include <tchar.h>
#include <Psapi.h>
#include <shlwapi.h>

#pragma comment (lib, "Psapi.lib")
#pragma comment (lib, "shlwapi.lib")

int _tmain (int argc, LPCTSTR argv[])
{
    DWORD arProcessIds[1024], cbNeeded, i, dwStatus;
    HANDLE hProcess = NULL;
    LPCTSTR pszProcessName = NULL;

    if (argc != 2) {
        _tprintf (TEXT("USAGE:\n")
                  TEXT("    \"%s\" ExeName\n\n")
                  TEXT("Examples:\n")
                  TEXT("    \"%s\" TaskMgr.exe\n"),
                  argv[0], argv[0]);
        return 1;   // error
    }
    pszProcessName = argv[1];

    if (!EnumProcesses (arProcessIds, sizeof(arProcessIds), &cbNeeded)) {
        // here shold be allocated array dynamically
        return 1;   // error
    }
    for (i = 0; i < cbNeeded/sizeof(DWORD); i++ ) {
        if (arProcessIds[i] != 0) {
            TCHAR szFileName[MAX_PATH];
            hProcess = OpenProcess (PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, arProcessIds[i]);
            if (hProcess != NULL) {
                dwStatus = GetProcessImageFileName (hProcess, szFileName, sizeof(szFileName)/sizeof(TCHAR));
                if (dwStatus > 0 ) {
                    LPCTSTR pszFileName = PathFindFileName (szFileName);
                    //_tprintf(TEXT("Process: %s\n"),szFileName);
                    if (StrCmpI(pszFileName, pszProcessName) == 0) {
                        break;
                    }
                }
                CloseHandle (hProcess);
                hProcess = NULL;
            }
        }
    }
    //hProcess = OpenProcess (SYNCHRONIZE, FALSE, dwProcessId);
    if (hProcess == NULL) {
        _tprintf(TEXT("The process \"%s\" is not found.\n"), pszProcessName);
        return 1;
    }

    _tprintf(TEXT("Start waiting for the end of the process %s\n"), pszProcessName);
    WaitForSingleObject(hProcess, INFINITE);
    _tprintf(TEXT("The process is terminated"));
    CloseHandle (hProcess);

    return 0;
}
0 голосов
/ 22 ноября 2010

вы можете просто получать список процессов из ОС с необходимыми интервалами и предпринимать соответствующие действия

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