Newsgroup: it.comp.lang.visual-basic
Titolo: Eseguire una procedura in uscita da windows

Devo, in generale, eseguire una procedura dopo che il pulsante OK alla
richiesta di SPEGNERE il computer.
In pratica devo loggare a che ora e giorno viene spento e acceso il
computer.
Per l'accensione non ho problemi, mettendo il prog in avvio automatico, ma
per lo spegnimento ?
Mi dareste una mano ?
p.s. sarebbe bello anche un metodo per loggare anche spegnimenti
accidentali, tipo "schiaccio brutalmente il pulsante di spegnimento".
Grazie.
--
by by
bye SLI (@
mindless.com
)
--------------------------
NKV - 
http://nkv.iscool.net
--------------------------
visita il mio sito di Balle Spaziali:
http://ballespaziali.isfun.net
www.geocities.com/hollywood/picture/1467
--------------------------
ICQ UIN 18228970
--------------------------
"Genovese D.O.C."
--------------------------

Per intercettare la chiusura subito dopo la pressione del tasto OK dovresti
intercettare l'evento QueryUnload. In ogni caso questo evento si verifica
ogni qual volta il programma viene chiuso, e pertanto non solo la chiusura
di windows, ma anche la normale chiusura operata dall'utente. E' da
considerare anche il caso in cui l'utente scelga annulla alla eventuale
richiesta di salvaggio di un altro prog (e.g. Word) e in quel caso, se il
tuo programma venisse terminato per primo rimarrebbe il sistema accesso, e
il programma... chiuso. E comunque non saresti in grado di intercettare gli
spegnimenti accidentali. Per intercettare quelli dovresti inserire un Timer,
che ad es. ogni 10 secondi salvi data e ora corrente da qualche parte
sull'HD o in un file di testo oppure (credo abbastanza pericoloso) nel
registro di configurazione... e con il primo metodo correresti il rischio
che non venendo chiuso correttamente il file ti imbatta al riavviņ in
qualche Lost Chain rilevabile con ScanDisc.
Non mi vengono idee migliori...
Bye
Aldebaran.

 Non mi vengono idee migliori...
So che esiste anche una chiamata API "WM_QUERYENDSESSION" ma non saprei
neanche da che parte
iniziare per implementarla ! (anche se credo che questa sia la soluzione
migliore)


 migliore)
Sì, questo è il metodo migliore anche se WM_QueryEndSession non è una
funzione bensì un messaggio che ti viene spedito da Win quando qualcuno
tenta di spegnere il PC (tramite "Chiudi sessione" o tramite chiamata a
ExitWindowsEx...)
Mi scuso con te ma non ho la + pallida idea di come intercettare quel msg in
VB (sono un principiante) cmq trovato il modo (e di sicuro c'è, spero che
qualcuno ti spieghi come che così imparo anch'io) puoi sfruttare quello per
chiamare la tua procedura...
Ricordati però che il messaggio WM_QueryEndSession ti chiede se il sistema
può essere spento (c'è un valore di ritorno True o False a seconda che tu
acconsenta o meno) e che quindi non è sempre detto che poi il sistema venga
effettivamente spento (per esempio: hai 3 applicazioni, la tua è la 2a a cui
viene spedito il msg; la prima risponde "Ok, spegni pure", la tua effettua
la procedura e risponde "Ok,spegni pure"  ma se la terza risponde "col
cavolo che spegni qui!" ti ritrovi che secondo te il computer è spento, e
invece no...)
Per avere un controllo + preciso io userei il WM_EndSession che ti notifica
la chiusura della sessione...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply

 migliore)
Corrisponde all'evento QueryUnload di VB citato prima
Mandi
Aldebaran

 Corrisponde all'evento QueryUnload di VB citato prima
No, il QueryUnload viene richiamato sicuramente _anche_ durante la gestione
del WM_QueryEndSession ma (per esempio) anche dalla semplice chiusura della
Form...


 la chiusura della sessione...
Sicuro che esista e che faccia proprio quello che dici ?
Cmq. su 
programmazione.it
 ho trovato un articolo sulla gestione dei
messaggi, appena lo finisco di leggere ti faccio sapere.


 Corrisponde all'evento QueryUnload di VB citato prima
Ho fatto il programma con queryunload.
Direi che in genere funziona, ma A VOLTE quando chiudo la sessione, invece
che loggare e uscire, appare una finestra dove indica che un programma (non
dice quale, ma suppongo il mio) e' in esecuzione e win non puo' essere
chiuso. MI propone: ATTENDI, TERMINA PROG e ANNULLA.
Se Attendo, attendo ma non succede nulla.
Se Termino, si spegne il comp ma non logga.
Se Annullo, torno a windows.
Opinioni a riguardo ?


 messaggi, appena lo finisco di leggere ti faccio sapere.
Dal Win32 SDK:
Windows 95: WM_ENDSESSION
fEndSession = (BOOL) wParam;    // end-session flag
fLogOff = (BOOL) lParam         // logoff flag
Windows NT: WM_ENDSESSION
fEndSession = (BOOL) wParam;    // end-session flag
The WM_ENDSESSION message is sent to an application after Windows processes
the results of the WM_QUERYENDSESSION message. The WM_ENDSESSION message
informs the application whether the Windows session is ending.
Parameters
fEndSession
Value of wParam. Specifies whether the session is being ended. If the
session is being ended, this parameter is TRUE; otherwise, it is FALSE.
fLogOff
Windows 95 only: Value of lParam. Indicates whether the user is logging off
or shutting down the system. This parameter is TRUE if the user is logging
off; it is FALSE if the user is shutting down the system.
Return Value
If an application processes this message, it should return zero.
Remarks
If the fEndSession parameter is TRUE, the Windows session can end any time
after all applications have returned from processing this message.
Therefore, an application should perform all tasks required for termination
before returning from this message.
Note that lParam is not used on the Windows NT platform but is used on the
Windows 95 platform.
The application need not call the DestroyWindow or PostQuitMessage function
when the session is ending.
-------
