Newsgroup: it.comp.lang.visual-basic
Titolo: Capire quando un'applicazione viene chiusa

Esiste un sistema per capire quando un'applicazone esterna viene 
chiusa ?
Penso che si debba usare il Pid del programma in oggetto ma quando 
questo viene chiuso come faccio ad intercettarlo dalla mia 
applicazione ?
Grazie, Alverman

 ha scritto nel messaggio
news:200711111...@mynewsgate.net...

Il PID o ProcessID č utile se lanci tu l'applicazione esterna dall'interno
del
tuo applicativo usando Shell o ShellExecEx dai quali riesci a ricavare il
PID(dal primo
in modo diretto, mentre dal secondo tramite l'atomo della variabile
strutturata da usare).
Personalmente uso il PID solo se devo usare il WaitForSingleObject dopo aver
aperto un Processo Sincrono...!
In tutti gli altri casi potrebbe essere piů semplice recuperare l'hWnd della
Finestra(Se esiste)
usando FindWinwow o cercando l'hWnd assegnato al PID con
GetWindowThreadProcessId che trovi documentato
con tanto di Esempio su Allapi(Mentalis)
In entrambi i casi mi sembra ovvio che CICLICAMENTE tu debba scorrere tutte
le Finestre, oppure tutti i
Processi(dai quali ricavi il PID) e verifichi se č ancora presente quello
che hai in origine...
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.alessandrobaraldi.it
---------------------------------------------------------------------------

Grazie...... sto provando !!
Esiste qualcosa che mostri tutti i pid in esecuzione ?
Grazie, Alverman

Ma se lancio l'eseguibile con shellexecute come faccio ad assegnare il 
pid del programma che lancio per poi poterlo verificare.
Quando lancio shellexecute con:
pid = ShellExecute(hWnd, vbNullString, DataSplit(1), vbNullString, 
vbNullString, SW_SHOWMAXIMIZED)
Private Sub Form_Load()
    Dim Pid As Long
    'Lock the window update
    LockWindowUpdate GetDesktopWindow
    'Execute notepad.Exe
    'Datasplit(1) è il nome del file da eseguire e non il programma che 
lo eseguirà
    pid = ShellExecute(hWnd, vbNullString, DataSplit(1), vbNullString, 
vbNullString, SW_SHOWMAXIMIZED)
    If Pid = 0 Then MsgBox "Error starting the app"
    'retrieve the handle of the window
    mWnd = InstanceToWnd(Pid)
    'Set the notepad's parent
    SetParent mWnd, Me.hwnd
    'Put the focus on notepad
    Putfocus mWnd
    'Unlock windowupdate
    LockWindowUpdate False
End Sub
ed eseguo la procedura che ho trovato in Api-guide mi 
ritorna,GIUSTAMENTE, il pid di VB.
Come posso fare ?
Grazie, Alverman

 ha scritto nel messaggio
news:200711111...@mynewsgate.net...

Il difetto di non spiegare mai bene quello che serve comporta un'aumento di
Entropia assurdo...!
Devi aprire un Eseguibile ed ATTENDERNE LA FINE....?
Se si non era più facile dirlo prima invece di inventarsi come fare...?
Passa a questa chiamata il PID .....
Private Const INFINITE = &HFFFF ' Infinite timeout
Private Const WAIT_OBJECT_0 = 0
Private Const WAIT_ABANDONED_0 = 80
Private Const WAIT_TIMEOUT = 102
Function WaitForProcess(TaskId As Long) As Boolean
    Dim procHandle As Long
    Dim lRet As Long
    procHandle = OpenProcess(&H100000, True, TaskId)
    lRet = WaitForSingleObject(procHandle, INFINITE)
    WaitForProcess = Hex(lRet) = WAIT_OBJECT_0
    CloseHandle procHandle
End Function
Oppure(da Giorgio Rancati):
Sub MyShell(ByVal Percorso As String, _
            ByVal windowstyle As Integer, _
            ByVal Attendi As Boolean)
Dim wshell As Object
Set wshell = CreateObject("WScript.shell")
wshell.Run Percorso, windowstyle, Attendi
Set wshell = Nothing
End Sub
--------------- 
Per l'utilizzo
---------- 
MyShell "C:\Documenti\Documento1.Doc",1,0
---------- 
Altrimenti spiegati meglio così non facciamo del fritto inutile...


 Se si non era più facile dirlo prima invece di inventarsi come fare...?
Allora mi spiego meglio.
Ho un'applicazione che gira su pc1 che fa quello che gli dico da un'altra 
applicazione su Pc2.
Da pc2 dico a Pc1 di aprire un'applicazione mandando il percorso completo 
del file da aprire (verrà aperto il programma associato) via shellexecute.
Il programma che sta su Pc2 ha la possibilità di chiudere l'esecuzione 
lanciata su pc1 in qualsiasi momento si voglia e nel frattempo (mentre su 
Pc1 gira il file che ho lanciato da Pc2) posso interagire con il mio 
programma di Pc1 (modificare la configurazione, fare richieste ecc).
In caso l'utente che sta su Pc1 dovesse chiudere l'esecuzione che ho fatto 
partire da Pc2 mi spiazzerebbe perchè verrebbero a mancare determinate 
condizioni da me impostate.
Dal momento che quando chiudo un'esecuzione da Pc2 lo faccio chiudendo 
l'applicazione di Pc1 in primo piano.
Quindi avevo pensato che quando su Pc1 viene lanciata l'esecuzione di un 
file di inviare a Pc2 il Pid dell'esecuzione e se invece di chiuderla io da 
Pc2 venisse chiusa manualmente dal Pc1 controllando la presenza del Pid su 
Pc1 e non trovandola mandavo un messaggio a Pc2 per informarlo e reimpostare 
i suoi controlli.
Boh ....... penso di aver peggiorato le cose.
Comunque questo è quello che intendevo con quelle due righe di inizio thread
Alverman