Newsgroup: it.comp.lang.delphi
Titolo: Chiusura di un programma

Ciao,
devo fare una procedura che chiuda un programma attivo, come faccio senza
sapere l'handle ? O il nome della form ?
Grazie Stefano Tampieri

sapere l'handle ? O il nome della form ?
Penso proprio che tu non possa farlo....o se lo fai Killi
indiscriminatamente tutti i processi
attivi, una sorta di distruzione in broadcast.
Scusa ma il problema è nel ricavare l'handle?
Ciao
--
- Carlo -
BSSoftware Tips Mailing-List Support

>sapere l'handle ? O il nome della form ?
Dimenticavo, prima che quacuno in agguato mi corregga..... :)
Puoi farlo ma devi comunque avere altri tipi di informazioni, ad esempio
l'ID del processo
o qualcos'altro....qualcosa su questa applicazione devi sapere comunque.
Ciao Again


 l'ID del processo o qualcos'altro....qualcosa su questa applicazione devi
sapere comunque.
Ad esempio puoi ricavarti il nome della classe (non della form) a priori e
poi fare un
 findwindow(nomeclasse,nil)...
oppure... findwindowbypoint ( p:tpoint )
... penso che l'handle ti serva comunque ... ma ci sono molti modi per
ricavarlo.
Se non riesci a risolvere con le informazioni che ti ho dato, potresti
provare a cosultare l'help:
"findwindow" e poi sul group (che è Windows Functions)
Ciao, spero di averti aiutato!!
Davide DG.


Si.
Come faccio a sapere l'elenco dei programmi attivi  ? E la relativa classe
per cercare l'handle con findwindow ?
--
Ciao,
Stefano Tampieri

 sapere l'handle ? O il nome della form ?
A parte tutto ciò che ti hanno già scritto, potrebbe bastarti anche solo
sapere il nome dell' .exe ...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
Ps: sarebbe comodo sapere se ti serve farlo sotto Win9X o WinNT/2000...
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply

per cercare l'handle con findwindow ?
Innanzitutto devi farmi capire a cosa fai riferimento, perchè prima parli di
programmi
e poi parli di finestre...non è detto che ogni programma abbia una sua
finestra.
Se l'handle che ti interessa è quello di una finestra puoi provare con la
EnumWindow
che vuole un puntatore ad una funzione di callback.
Se l'handle a cui fai riferimento è quello di un processo puoi provare a
fare un ciclo ricavando gli handle (GW_HWNDNEXT etc..)
o forse una soluzione più pulita è quella di utilizzare le API ToolHelp32,
di cui però non ti so dire molto.
Le conosco perchè me ne parlò Andrea (Magni) tempo fa, ma non mi sono mai
documentato su queste.
Anche se non le conosco tranquillo che si imparano.
Fammi sapere cosa preferisci e vedrò come aiutarti.


 wrote in message
95374137...@melissa.energy.it...


 metti che voglio chiudere un altro programma ?
La Findwindow funziona anche solo con il nome della classe, cioè se tu non
sai apriori
il nome della caption, puoi usare :
 H := findwindow ('q4',nil); --> ti ritorna l'handle della prima(non ricordo
in che ordine) finestra
che abbia come nome di classe quello specificato, senza applicare criteri
sulla caption (che può essere
quella che vuoi).
Il problema a questo punto sorge se ci sono più finestre aperte con lo
stesso nome di classe.
Ora, se le finestre sono dipendenti tutte da una applicazione (non finestra)
"madre", puoi provare
a fare :
 P := getparent ( H ); ti ritorna l'handle (se esiste ... devi provare!!)
dell'applicazione madre.
Puoi fare delle prove (backup prima ovviamente!!) cercando di chiudere
l'applicazione madre P.
Se invece questa applicazione madre non esiste (cioè il programma Ominis
genera una finestra indipendente
per ogni processo/file aperto ... tipo il notepad per intenderci, invece del
word), allora la strada penso sia più difficile:
dovresti usare la EnumWindows per avere l'handle di tutte le finestre di
primo livello, ricavarti i nomi delle classe e delle
caption dagli handle (2 api) e crearti tu un filtro di ricerca appropriato.
Se sei in questa situazione e non sai usare la enumwindows (che, secondo il
mio modesto parere... non è facile da usare!!),
riscrivi !!
Spero di averti aiutato ... vedrai che ne verrai fuori !!!
CIAUZZ!!! Davide DG.


Grazie.
Stefano Tampieri

 chiuderli.
Per avere una lista dei processi attivi puoi usare le ToolHelp32 (o le PSAPI
se sei sotto NT), non sono difficilissime ma se non hai particolari esigenze
prova la EnumWindows (magari con un controllo IsWindowVisible sull'handle
della callback...)
Da lì (visto che ti vengono enumerati tutti gli handle delle finestre
top-level presenti) puoi estrarre la classe, il titolo ecc ecc ecc...
Poi ti basta inviare un WM_SYSCOMMAND con wparam = SC_CLOSE per chiudere la
finestra (oppure puoi stroncare il processo intero se vuoi...)
Ciao :-)
Ps: non conosco Omnis quindi non so se l'applicazione è una console o una
normale finestra Win [però visto la classe che citi direi la seconda
ipotesi]
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
