Newsgroup: it.comp.programmare.win32
Titolo: Chiusura processi

Salve a tutto il newsgroup.
Avrei la necessità di chiudere alcuni processi che ho precedentemente
avviato dal mio programma, di cui conosco l'id del processo.
Ho visto che è possibile usare la funzione PostMessage() con il
messaggio
WM_CLOSE; però è necessario sapere anche l'handle della finestra da
chiudere, che nel mio caso sarebbe la finestra "principale"; so che in
realtà in Windows non esiste una finestra principale, tuttavia per
capirci
mi riferisco a quella form che in un'applicazione MDI contiene le child
e
a quella che in una SDI con la sua chiusura provoca la fine del
programma,
tipo il thread primario del applicazione.
Sono riuscito anche a ottenere un elenco delle finestre appartenenti al
processo, però volendo evitare di salvarmi tutti i nomi delle classi
delle
finestre "principali" dei processi che ho creato, come faccio a
identificarle?
Mi servirebbe un qualcosa come il TaskManager di Windows in si può
chiudere qualsiasi applicazione permettendo a quest'ultima di chiudersi
come se fosse l'utente a chiuderla, infatti deve essere eseguito il
codice
che ho inserito negli eventi "CloseQuery" delle form appartenenti ai
processi che devo chiudere.
P.S.: il problema si è presentato con Delphi 5, comunque conosco anche
il
C, quindi mi è sufficiente anche una soluzione per il C, che tradurrò
poi per
il Delphi.
Grazie in anticipo.
Alessandro

Alessandro Vanni ha scritto:

prova con PostThreadMessage, mandando il messaggio WM_QUIT
ciao

 prova con PostThreadMessage, mandando il messaggio WM_QUIT
Innanzi tutto grazie per la risposta.
La PostThreadMessage() ha bisogno dell'id del thread a cui inviare il
messaggio, però non so su W2K come trovare l'elenco dei thread di un
processo e poi come trovare quello principale.
Alessandro

 processo e poi come trovare quello principale.
enumerando i thread con le Toolhelp* il primario dovrebbe essere
semplicemente il primo della lista; ma credo che quest'ultima non cosa sia
ufficialmente documentata, quindi non è molto elegante farci affidamento.
*
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/tool_help_library.asp?frame=true
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 prova con PostThreadMessage, mandando il messaggio WM_QUIT
Innanzi tutto grazie per la risposta.
La PostThreadMessage() ha bisogno dell'id del thread a cui inviare il
messaggio, però non so su W2K come trovare l'elenco dei thread di un
processo e poi come trovare quello principale.
Alessandro

"Alessandro Vanni" <Alessan...@Interfree.it> ha scritto nel messaggio 
news:1161717411.7...@b28g2000cwb.googlegroups.com...
Salve a tutto il newsgroup.
Avrei la necessità di chiudere alcuni processi che ho precedentemente
avviato dal mio programma, di cui conosco l'id del processo.
Ho visto che è possibile usare la funzione PostMessage() con il
messaggio
WM_CLOSE; però è necessario sapere anche l'handle della finestra da
chiudere, che nel mio caso sarebbe la finestra "principale". [...]
Se vuoi puoi pescare l'handle principale del processo appena viene lanciato 
(con CreateProcess(...) suppongo, visto che hai l'id):
se vuoi tentare quata strada NON sparare GetForegroundWindow() in un ciclo 
temporale confrontandolo poi con l'handle della tua finestra, ma usa la più 
professionale WaitForInputIdle (cercane la documentazione).
Comunque mi pare di ricordare che 1 o 2 mesi fa c'era un altro thread a 
riguardo su questo stesso newsgroup, in cui ho postato proprio una risposta 
alla tua stessa domanda, in cui non trovavo l'handle del processo lanciato, 
ma lo chiudevo direttamente in modo "pulito"... prova a fare una ricerca 
(adesso non mi ricordo più come facevo). Ciao.

 posso trovare la handle della main window di questo processo?
Non so se puņ servire, ma recentemente ho avuto modo di fare un programma
che chiude in modo pulito (senza usare ::TerminateProcess(...)) un programma
lanciato con createProcess(...).
In realtą perņ a te serve l'handle della main window... io non ho una
risposta definitiva... (a meno di catturarla con ::GetForegroundWindow(...)
con un ciclo di alcuni secondi dopo ::CreateProcess(...) (puoi confrontarlo
con l'handle del tuo programma per non sbagliare).
Forse se vuoi solo inviare messaggi puoi provare con:
::PostThreadMessage(processInfo.dwThreadId,WM_CLOSE,0,0);   (processInfo
ritorna da ::CreateProcess(...))
Concludendo, se vuoi sapere solo come ho fatto a chiudere in modo pulito un
programma:
Basta chiamare questa API:
::EnumWindows((WNDENUMPROC)TerminateAppEnum,(LPARAM)
processInfo.dwProcessId) ;
e definire questo metodo statico:
static bool CALLBACK TerminateAppEnum(HWND hwnd,LPARAM lParam)
{
DWORD dwID;
::GetWindowThreadProcessId(hwnd,&dwID);
if(dwID==(DWORD)lParam)
      {
      ::PostMessage(hwnd, WM_CLOSE, 0, 0) ;
      }
return true;
}

In realtà però a te serve l'handle della main window... 
Non esiste una "main window", nelle applicazioni Windows.

"Andrea Laforgia" <a.laf...@andrealaforgia.it.invalid> ha scritto nel 
messaggio news:37o9k2hgcj8nf7em1...@4ax.com...

Beh..., in realtà avevo risposto a un thread intitolato proprio "Come 
trovare l'handle della main window" (o qualcosa del genere). 

trovare l'handle della main window" (o qualcosa del genere). 
Quindi ?
In che modo quanto hai appena scritto confuta il fatto che per le
applicazioni Windows non esiste *alcuna* "main window" ?

 Non esiste una "main window", nelle applicazioni Windows.
certo che esiste; questa pagina ne parla piuttosto approfonditamente:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/aboutwindows.asp?frame=true
inoltre quest'altra:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowfeatures.asp?frame=true
afferma anche che una "overlapped window" creata da un'applicazione è
intesa come main window dell'applicazione stessa; se poi un'applicazione
crea N overlapped windows allora vorrà dire che è un'applicazione dal
design alquanto strano (utilizza N main windows...).
PS: "main window" fa parte di una terminologia più da "design guidelines"
che tecnica, ma non puoi assolutamente dire che il concetto non esiste;
almeno poi avessi detto che non esiste in Win32... invece hai detto che
non esiste in *tutto Windows*!!


"Andrea Laforgia" <a.laf...@andrealaforgia.it.invalid> ha scritto nel 
messaggio news:lilck25uhg29rsfpb...@4ax.com...

Nessuno, mi pare charo, no!
In realtà io non sapevo se esistessero o meno "main form", ma ho cercato di 
rispondere lo stesso a una domanda.
Sto vedendo comunque che su questo ci sono già opinioni discordanti; 
peccato, non mi piacciono i thread che cominciano con una domanda 
"programmatica" e finiscono poi con zuffe verbali su varie definizioni... 

> applicazioni Windows non esiste *alcuna* "main window" ?
Hey! Perche' io non vedo il messaggio di a.laforgia?
Forse il mio provider mi sta CENSURANDO qualcosa?

non esiste in *tutto Windows*!!
Stiamo in it.comp.programmare.WIN32, quindi se si parla di Windows qui
dentro, si parla di Win32.  Questo è scontato.

"programmatica" e finiscono poi con zuffe verbali su varie definizioni... 
Non c'è nessuna "zuffa verbale" in corso.

 parla in questo thread.
cioè...?


cioè...?
Rileggi il thread.

 Non ne ho idea, visto che sto dicendo che non esiste.
se ti diverte parlare di chimere avvisa prima, così faccio selezione
quando ti rispondo :)
