Newsgroup: it.comp.lang.delphi
Titolo: Alla chiusura di Windows

Salve a tutti, uso D5
Ho realizzato una applicazione che, restando sempre attiva, alla
chiusura del sistema effettua delle copie di file.
Il problema è che quando i file sono tanti, windows dopo un po di tempo,
fa comparire la finestra di messaggio che avverte che il programma non
risponde alla chiusura, con l'opportunità di annullare il processo e
continuare la chiusura.
La domanda è se esiste la possibilità di bloccare la chiusura di windows
fino a quando il programma non ha finito il suo lavoro.
Grazie a tutti in anticipo.
http://www.micla.it

fino a quando il programma non ha finito il suo lavoro.
Devi intercettare il messaggio che Windows invia alla chiusura
(WM_QUERYENDSESSION) ed agire di conseguenza.
--
Walkie...@Libero.It (ICQ# 8143647)

(WM_QUERYENDSESSION) ed agire di conseguenza.
TForm.OnCloseQuery

E proprio quella la procedura che uso, ma Windows dopo un pň di tempo mi
apre una finestra con il messaggio che dicevo sopra.


apre una finestra con il messaggio che dicevo sopra.
Intercetta il messaggio, come ti ho suggerito.
--
Walkie...@Libero.It (ICQ# 8143647)

Intercetta il messaggio, come ti ho suggerito.
E' la stessa identica cosa. (guardati la VCL)
Io infatti ho risposto a te e non al thread originale (di cui non so
la soluzione, ma almeno ho capito di cosa si sta parlando).
Ciao,
Alan Solo

E' la stessa identica cosa. (guardati la VCL)
Non e' la stessa cosa, considerando il fatto che le applicazioni
potrebbero benissimo non avere finestre.
--
Walkie...@Libero.It (ICQ# 8143647)

potrebbero benissimo non avere finestre.
uff... dimmi cosa centra se è una applicazione con o senza finestre
per il problema del thread...
Ciao,
Alan Solo

per il problema del thread...
Usare TForm.OnCloseQuery e intercettare WM_QUERYENDSESSION non e' la
stessa cosa.  Cmq, da oggi in poi ti inserisco nel kill-file, quindi
non leggero' i tuoi messaggi.
p.s.: si dice "c'entra", non "centra", impara l'italiano.
--
Walkie...@Libero.It (ICQ# 8143647)

p.s.: si dice "c'entra", non "centra", impara l'italiano.
hahaha.. senti ki parla..
ma, ca##o cosa fai? avevi detto di non leggere + i miei post!
Alan Solo

Grazie a tutti per l'interessamento.
Comunque ho provato ad utilizzare l'evento <WM_QUERYENDSESSION>, però
succede sempre che dopo un pò compare qul messaggio.
Ho provato ad utilizzare anche l'evento seguente <WM_ENDSESSION>, con il
risultato che il programma viene "killato" e la chiusura di Windows
procede, senza nessun messaggio (però comunque non tutti i file vengono
copiati). Ho stimato che Windows concede una decina di secondi prima di
abortire il processo, ma se il processo dura di più come faccio? è
possibile che non ci sia il modo di mettere in "pausa" il processo di
chiusura e poi riavviarlo a lavoro finito?
Grazie atutti di nuovo.


Grazie a tutti per l'interessamento.
Comunque ho provato ad utilizzare l'evento <WM_QUERYENDSESSION>, però
succede sempre che dopo un pò compare qul messaggio.
Ho provato ad utilizzare anche l'evento seguente <WM_ENDSESSION>, con il
risultato che il programma viene "killato" e la chiusura di Windows
procede, senza nessun messaggio (però comunque non tutti i file vengono
copiati). Ho stimato che Windows concede una decina di secondi prima di
abortire il processo, ma se il processo dura di più come faccio? è
possibile che non ci sia il modo di mettere in "pausa" il processo di
chiusura e poi riavviarlo a lavoro finito?
Grazie a tutti di nuovo.


Grazie a tutti per l'interessamento.
Comunque ho provato ad utilizzare l'evento <WM_QUERYENDSESSION>, però
succede sempre che dopo un pò compare qul messaggio.
Ho provato ad utilizzare anche l'evento seguente <WM_ENDSESSION>, con il
risultato che il programma viene "killato" e la chiusura di Windows
procede, senza nessun messaggio (però comunque non tutti i file vengono
copiati). Ho stimato che Windows concede una decina di secondi prima di
abortire il processo, ma se il processo dura di più come faccio? è
possibile che non ci sia il modo di mettere in "pausa" il processo di
chiusura e poi riavviarlo a lavoro finito?
Grazie atutti di nuovo.


chiusura e poi riavviarlo a lavoro finito?
[premetto che č solo un suggerimento, non testato]
potresti mettere nel OnCloseQuery;
form1.oncloesquery;
begin
 CanClose:=False;
 ProceduraChefaCioCheVuoi;
end;
procedure ProceduraChefaCioCheVuoi;
begin
 fai quallo che vuoi;
 ChiudiWindows ( con ExitWindowsEx)
end;
prova, non ti assicuro niente...
Ciao,
Alan Solo

tempo mi apre una finestra con il messaggio che dicevo sopra.
allora tu annulla lo shutdown e riprendilo per conto tuo (ExitWindows) 
quando hai finito. Oppure prima copi i file e poi lo shutdown lo inizi 
tu (praticamente, per iniziare lo shutdown usi il tuo programma anzichč 
i metodi tradizionali)

Si funziona ma il problema sta che questo evento viene richiamato sempre
in qualsiasi modo la form venga chiusa, ed č il primo ad essere
attivato.
Quindi se l'utente chiudesse la form si chiuderebbe anche Windows,
potrei rilevare la pressione del pulsante, ma rimane sempre la chiusura
forzata con Alt Ctrl Canc.
Comunque facendo delle prove, ho scoperto che richiamando l'evento
"WM_QUERYENDSESSION", e non mettendo niente nella procedura che lo
richiama, effettivamente la chiusura viene interrotta e sulla base di
questo blocco sono riuscito ad ottenere qualcosa che si avvicina molto a
ciň che volevo realizzare, l'ultimo quesito č questo:
quando riprendo la procedura di chiusura (con ExitWindowsEx) del
sistema, come faccio a sapere l'utente che tipo di scelta aveva
effettuato?
Ossia per la chiusura di Windows posso avere:
Arresto
Riavvio
Avvio in Dos (per i vecchi S.I.)
Quindi mi chiedo esiste un modo di sapere la scelta fatta dall'utente
per la chiusura di Windows?
Grazie ancora.


 i metodi tradizionali)

Avvio in Dos (per i vecchi S.I.)
WM_QUERYENDSESSION  
nSource = (UINT) wParam;    // source of end-session request 
fLogOff = lParam            // logoff flag 
 
Parameters
 nSource Reserved for future use. 
 fLogOff
  Value of lParam. Indicates whether the user is logging off or
shutting down the system. Supported values include: ENDSESSION_LOGOFF.
a quanto pare si puo' solo sapere se si sta sloggando o shuttando...
passo la parola
Ciao,
Alan Solo

 non leggero' i tuoi messaggi.
questa e' la risposta piu' lamer del mondo, e la considerazione che avevo di
te (gia' estremamente bassa) si avvicina allo zero assoluto.
Se non sai discutere, o non conosci gli argomenti, per favore stai a casa.
Comunque voglio finire anche io in kill-file, ti prego dammi questo onore :)