Newsgroup: it.comp.lang.visual-basic
Titolo: come sapere se una applicazione e' ancora aperta?

Con l'uso di shell viene restituito un ID di task
Dovendo controlare se l'applicazione chiamata e' ancora operativa o
meno, come posso fare un check se quel'id e' ancora attivo?
oppure c'e' qualche altra via?
Grazie a tutti
Nicola
   Nicola Tornieri
   ----------------------------
  Manens Intertecnica srl
  tornieri[at]
manens.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: E-Mail address in "From:" line is INVALID!  Use address in signature.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Unsolicited advertising sent to this E-Mail address is expressly prohibited 
under USC Title 47, Section 227.  Violators are subject to charge of up to 
$1,500 per incident or treble actual costs, whichever is greater.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 oppure c'e' qualche altra via?
Usa ShellExecuteEx per avviare un processo.
Nella struttura SHELLEXECUTEINFO che viene
"riempita" dalla funzione, ti vengono restituiti gli
handle dell'istanza dell'applicazione e il nome della classe.
Quando vuoi sapere se l'applicazione fa ancora
parte dei task di sistema, fai una ricerca con
FindWindow passando alla funzione il nome della
classe ottenuto in precedenza.

oppure c'e' qualche altra via?
Il modo migliore sarebbe di non usare la shell di VB ma la funzione
ShellExecuteEx (che però è un po' pallosa).
Per avere informazioni di questo tipo si dovrebbe avere non il process-id ma
l'handle del processo (che Shell non ritorna: giustamente, visto che è una
chiamata asincrona, chiude immediatamente l'handle).
Se vuoi una soluzione empirica basata su Shell, prova questa:
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess
As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)
As Long
Private Const PROCESS_QUERY_INFORMATION = &H400
dim pid as Long
dim ph as Long
pid = Shell("c:\windows\notepad.exe")
....
ph = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid)
If ph Then
        'il processo è ancora ragionevolmente attivo
    CloseHandle ph
        'NB: a questo punto avresti però l'handle, solo che ti sconsiglio di
non chiuderlo a meno che tu non sia molto cauto nel suo uso.
Else
        'il processo è ragionevolmente terminato
End If
NB: In questo modo sei certo solo del fatto che il processo è attivo:
l'esito negativo può essere dovuto ad altre cause (
p.es
. non hai privilegi
sufficienti con NT).
Variante un po' pericolosa (non più che usando ShellExecuteEx ):
Public Declare Function GetExitCodeProcess Lib "kernel32" Alias
"GetExitCodeProcess" (ByVal hProcess As Long, lpExitCode As Long) As Long
const STATUS_PENDING=&h00000103&
dim ec as long
pid = Shell("c:\windows\notepad.exe")
if pid = 0 Then
    'non so se funziona così Shell, ma zero non dev'essere un valore
possibile, quindi...
Else
    ph = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid)
    if ph = 0 Then
        'probabilmente l'applicazione si è chiusa, oppure ci sono problemi
di account...
    endif
end if
....
GetExitCodeProcess ph, ec
if ec = STATUS_PENDING then
    'ancora attivo
else
    'terminato (in ec il codice di uscita del programma)
endif
....
'!!!e alla fine ricordarsi:
CloseHandle ph
'!!!!!
----------------------------------------------------------------------
Stefano Minardi
zet...@mclink.it
----------------------------------------------------------------------