Newsgroup: it.comp.lang.delphi
Titolo: [D5] TerminateProcess Acrobat non schiatta

Ciao a tutti,
Ho necessità di chiudere in modo "Brutale" Acrobat, ma non riesco, non trovo
il nome corretto della classe di appartenenza.
Con WinSight ci sono infatti aperti più processi che si riferiscono ad
acrobat.exe.
Vi posto il codice:
    ...
    var
        HProc: THandle;
    begin
      HProc := FindWindow('Acrobat Viewer', nil);
      if HProc = 0 then
        ShowMessage('Impossibile trovare Acrobat!');
      TerminateProcess( HProc ,0 );
      Attesa(5);//una mia funzione che mi imposta una pausa di 5 secondi
    End;
Mi chiedo se fosse possibile terminare l'intera applicazione, conosciendo il
nome dell'eseguibile, tipo Acrobat.exe, un po' come si fa col task manager!
Grazie mille a tutti,
Davide

       TerminateProcess( HProc ,0 );
A parte il nome della classe, così non terminerai mai nulla. 
TerminateProcess vuole l'handle del processo, non di una finestra.
Fra le jedi c'è del codice già pronto, cmq se ne è parlato molte volte, se 
cerchi un po' su internet troverai decine di esempi.
Ciao
-- 
Andrea /\/\agni
ICQ# 174108000

 il nome corretto della classe di appartenenza...
Ciao,
confondi l'handle della finestra di Acrobat (reader?), con l'handle del
processo di Acrobat.
Prendendo per buono l'uso che fai di FindWindow:
Prendi l'handle della finestra e trattalo con GetWindowThreadProcessId (Vedi
la guida fornita col tuo Delphi).
Prendi l'Id del processo (Attenzione! del processo non del thread) e usalo
con la OpenProcess (abilita tutti gli accessi)... usa sempre l'SDK di Win32
fornito col tuo Delphi.
Prendi infine l'handle del processo e, brutalmente, lo zappi via.
Ma sinceramente...
Io prima proverei a inviare un wm_close alla finestra che ricavi con
FindWindow. Oltre a risparmiarti tutto il lavoro che segue, l'operazione è
meno, molto meno, radicale. TerminateProcess è sconsigliato usarla.
Quindi prima usa un sano PostMessage. Se funziona mantieniti con quello.
Ciao
Giuseppe

 Quindi prima usa un sano PostMessage. Se funziona mantieniti con quello.
ho provato anche a postare vm_close all'handle della finestra, e funziona,
ma con un piccolo problema:
    procedure TfmMain.Button2Click(Sender: TObject);
    var
      HAcro:HWND;
    begin
      HAcro := FindWindow('Afx:400000:8:10011:0:1a0191', nil);
      PostMessage(HAcro, WM_QUIT, 0, 0);
    end;
il nome della classe di appartenenza e variabile, ovvero in questa sessione
e:
    Afx:400000:8:10011:0:1a0191
in quella precedente e:
    Afx:400000:8:10011:0:40198
Allora io mi chiedo... e possibile risalire al nome della classe dall'handle
del processo? Oppure a questo punto mi conviene terminare brutalmente il
processo come dicevo prima?
Ho pensato anche ad utilizzare il titolo, ma viene prodotto a run time
dall'oggetto COM per l'invio dei fax (vedi mio post di qualche giorno fa),
quindi non conosco solo l'inizio del titolo della finestra, ovvero 'Adobe
Acrobat - '....
Mi sono perso....
Grazie mille per le vostre risposte,
Davide

 ma con un piccolo problema...
Piuttosto di usare FindWindow, usa EnumWindows. Nella CallBack ricavi il
nome della classe, GetClassName, e confronti solo i primi caratteri, ad
esempio i primi 10, quelli che non variano. Quando trovi la finestra giusta
invii il wm_close ed esci dal ciclo. Ho visto che hai usato wm_quit. Valuta
se ti serve veramente quello o può bastarti wm_close.
Consulta sempre l'SDK di Windows.
Ciao
Giuseppe
P.S. Attenzione! Se non ricordo male quella classe è usata anche da altri
software, tipo WinMX. Aggiungi altri controlli prima di chiudere la
finestra. Ad esempio: controlla il titolo; ricava il nome del file che ha
lanciato il processo (segui il mio precedente messaggio e come ultima
operazione, invece di TerminateProcess, usa GetModuleFileName); ecc.