Что нового

Процессы событие завершения процесса

RaZum

Знающий
Сообщения
78
Репутация
14
Известно имя/pid стороннего процесса.
Как получить событие при завершении этого процесса?
Имеется ввиду именно событие, а не постоянное отслеживание.

Так же интересует получение события закрытия (уничтожения) окна стороннего процесса.
 

All2khoff

Продвинутый
Сообщения
352
Репутация
65
Приведу пример, как вы не смотря на светофор увидите что там сменился цвет?
Только при условии что есть другие пешеходы которые своим поведением (к стати не всегда корректным) дадут вам знать что идти можно.
Если рассматривать в таком ключе и он вас устраивает, то вам нужно отслеживать другой процесс, который вам скажет что интересующего вас процесса больше нет.
Либо вам сам процесс должен сообщать, "я закончил, приступай".
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
получение события закрытия (уничтожения) окна стороннего процесса
Код:
#include <WinAPISys.au3>

OnAutoItExitRegister("OnAutoItExit")

$PID = Run("notepad.exe")
$HookWnd = WinWait("[class:Notepad]")

$hEventProc = DllCallbackRegister("EventProc", "none", "ptr;dword;hwnd;long;long;dword;dword")
$hEventHook = _WinAPI_SetWinEventHook($EVENT_OBJECT_DESTROY, $EVENT_OBJECT_DESTROY, DllCallbackGetPtr($hEventProc), $PID)

While Sleep(111)
WEnd

Func EventProc($hEventHook, $iEvent, $hWnd, $iObjectID, $iChildID, $iThreadId, $iEventTime)
  If $hWnd = $HookWnd Then Exit ConsoleWrite("ok" & @CRLF) * 0
EndFunc

Func OnAutoItExit()
  _WinAPI_UnhookWinEvent($hEventHook)
  DllCallbackFree($hEventProc)
EndFunc
 
Автор
R

RaZum

Знающий
Сообщения
78
Репутация
14
Я возможно неточно описал ситуацию.
Есть массив, в котором находятся инфа по процессам и окнам (pid/hWnd).
В него попадают процессы по маске и соответствующие им окна по мере опроса одной функции другими. Опрос только когда нужно, а не постоянно.
Так вот нужно удаление из массива информации соответсвующего окна и/или процесса по мере их удаления/завершения.
Пока всё происходит опросом через интервалы из главного цикла, но хотелось бы переложить это на ОС с получением события.
Затем всё пишется в консоль, из которой читает основной скрипт.
Ну вот такой спящий демон нужен ;)
Сообщение автоматически объединено:

По варианту получения событий окон с использованием Hook есть тоже вопросы.

На сколько я понял, функция GUIRegisterMsg регистрирует UDF на сообщение в пределах одного класса окон.

Для получения сообщений от окон других классов нужно с помощью "RegisterWindowMessage" получить отдельное динамическое ID специального сообщения (SHELLHOOK).

Потом с помощью GUIRegisterMsg зарегистрировать UDF на это сообщение.

Но этого мало, надо ещё с помощью "RegisterShellHookWindow" зарегистрировать дескриптор окна скрипта, для получения сообщения на это дескриптор.

В данном случае в зарегистрированную UDF будут сыпаться сообщения от всех окон, а хотелось бы только от определенного класса. Возможно ли такое?

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