Win32: Получить уведомление о закрытии / выходе другого приложения - PullRequest
1 голос
/ 16 мая 2009

Мое приложение должно отслеживать все другие запущенные приложения в системе. Есть ли какой-нибудь способ, которым я мог бы получать уведомления о выходе каждого приложения exe?

Методы, которые я мог найти:

1) Используйте функции PSAPI для получения списка запущенных exe-файлов через определенные промежутки времени. При каждом опросе сравнивайте с предыдущим списком, чтобы найти, какое приложение / процесс завершилось. Недостаток: требует постоянного опроса, займет процессорное время.

2) Установить глобальный хук для сообщения WM_CLOSE: с помощью этого я смогу получать уведомление, когда любое приложение закрывается через кнопку закрытия в строке заголовка

Неудобство: (-) Не все приложения генерируют сообщение WM_CLOSE (например, Total Video Player Exe) (-) Если приложение было закрыто через меню или кнопку «Выход» (например, Файл-> Выход), я не могу перехватить это сообщение

Есть ли другой лучший способ, который я пропустил? Пожалуйста, сообщите.

Ответы [ 4 ]

8 голосов
/ 16 мая 2009
  1. Получить список PID с использованием PSAPI.
  2. Затем получите дескриптор каждого процесса, используя OpenProcess () .
  3. Используйте WaitForMultipleObjects () для сигнализации при выходе из одного из процессов.
2 голосов
/ 16 мая 2009

Вы можете попробовать API RegisterShellHookWindow () и фильтр для сообщений HSHELL_WINDOWCREATED и HSHELL_WINDOWDESTROYED.

Конечно, вы будете получать уведомления только о приложениях с окном.

1 голос
/ 20 марта 2014

Я недавно столкнулся с этой проблемой и нашел решение, поэтому хотел поделиться со всеми вами. Это все правильно, как мы должны получить управление процессом. Однако вместо WaitForSingleOBject я бы рекомендовал использовать объектную функцию RegisterWaitForSingle. С помощью этой функции вы предоставляете функцию обратного вызова, и всякий раз, когда процесс завершается, вызывается ваша функция обратного вызова. Это лучше, чем вызывать WaitForSingleObject в потоке. Вызов WaitForSingleObject в вашем коде сам по себе заставит ваш код ожидать завершения процесса. Вот пример того, как это назвать:

RegisterWaitForSingleObject(&waitHandle, processHandle, ProcessTerminatedCallback, param, INFINITE, WT_EXECUTEONLYONCE);

Где: [out] waitHandle - новый дескриптор, созданный для вас. Обратите внимание, что вы не можете использовать этот дескриптор для вызова CloseHandle, но вы можете подождать его, если хотите.

[in] processHandle - дескриптор процесса, который вы должны получить сами

[in] ProcessTeridityCallback - функция обратного вызова, которая будет вызываться при выходе из процесса

[in] param - параметр LPVOID, который будет передан обратному вызову

[in] БЕСКОНЕЧНО - либо ждать бесконечно, либо в течение указанного времени, найдите MSDN для получения дополнительной информации

[in] WM_EXECUTEONLYONCE - вызовет функцию обратного вызова только один раз. посмотрите MSDN для получения дополнительной информации

0 голосов
/ 18 мая 2009

> Есть ли другой лучший способ, который я пропустил?

Да, много. См. Группа Win32 (системные уведомления, без каких-либо хуков)

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