[WinAPI] Wykrywanie zamknięcia innego programu

0

Witam,

Z góry piszę, że znam funkcje FindWindow i pochodne. Piszę komunikację między różnymi procesami. Procesy natychmiast wiedzą o swojej obecności dzięki zastosowaniu RegisterWindowMessage oraz wysyłaniu komunikatu HWND_BROADCAST, dzięki czemu nie muszę stosować timerów + FindWindow. Problem mam z kończeniem jakiegoś programu. O ile zakończenie następuje w sposób "naturalny" to jestem w stanie powiadomić "pozostałych". Gorzej jak użytkownik zabije jakiś proces lub zdarzy się cokolwiek co spowoduje jego nagłe zakończenie. Czy istnieje jakaś systemowa subskrypcja powiadamiająca o zakończeniu jakiegoś procesu? Koniecznie zależy mi na uniknięciu timerów.

Pozdrawiam

0

Poczytaj o ExitProc, np:
ExitProc

0

To jeszcze nie to. Jak zabiłem proces z poziomu managera zadań to nie był w stanie ostatnim tchem wywołać tę procedurę. Potrzebuję czegoś systemowego. Windows zabijając proces na pewno wie jaki uchwyt stworzony przez ten program zwalnia (np. przez CreateWindow()) . Pytanie jak inna aplikacja może wychwycić zwolnienie takiego uchwytu (bo ja ten uchwyt znam kiedy nawiązywałem "sesję" z tym programem, chcę wiedzieć kiedy jest zwalniany przez system)

0

Jak tworzysz dostajesz handle.

Handle procesu i watku jest sygnalizowany tylko jak watek lub proces przechodza w stan terminated.

0

Generalnie podpiąć się pod zdarzenie wyłączającego się procesu można za pomocą WMI.

http://msdn.microsoft.com/en-us/library/aa390425%28VS.85%29.aspx

Tutaj jest przykład jak wykryć utworzenie procesu. W twoim przypadku trzeba w zapytaniu zamienić __InstanceCreationEvent na __InstanceDeletionEvent. Obsługę zdarzenia definiujesz w klasie EventSink, metoda Indicate.
Ciało pętli z przykładu możesz zmodyfikować na:

IWbemClassObject* deletionObject = apObjArray[i];
IWbemClassObject* process;
VARIANT vProcess;

deletionObject->Get(L"TargetInstance", 0, &vProcess, 0, 0);
V_UNKNOWN(&vProcess)->QueryInterface<IWbemClassObject>(&process);

VARIANT vProcessName;
VARIANT vProcessID;
process->Get(L"Name", 0, &vProcessName, 0, 0);
process->Get(L"ProcessId", 0, &vProcessID, 0, 0);

printf("%ls (id: %d) zakonczyl sie\n", V_BSTR(&vProcessName), V_UINT(&vProcessID));

VariantClear(&vProcess);
VariantClear(&vProcessName);
VariantClear(&vProcessID);

Na początku bierzemy sobie ten nasz event, pobieramy z niego proces, którego dotyczy, a później jego nazwę i id.
http://msdn.microsoft.com/en-us/library/aa394372%28VS.85%29.aspx <- tutaj masz listę wszystkich właściwości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1