Newsgroup: it.comp.java
Titolo: scoprire quando viene spento il computer

Salve...
Ho un programmino che dovrebbe eseguire delle operazioni allo shutdown 
del sistema (microsoft windows). Come fare a "catturare" questo evento?

 del sistema (microsoft windows). Come fare a "catturare" questo evento?
Non in java.


Magari usando una dll? Qualcuno ne sa qualcosa? Forse ci sono dei 
trucchi?(come scoprire quando viene chiusa la JVM in esecuzione, o 
quando un programma sta per essere chiuso -non esplicitamente 
dall'utente - , oppure eseguire uno script chiamato da una chiave di 
registro - il duale delle chiavi in "Run")
Ci deve essere un modo.



Trasformi la tua applicazione java in un servizio tramite Java Service
Wrapper:
http://wrapper.tanukisoftware.org/doc/english/introduction.html
All'interno della tua applicazione implementi in una delle tue classi
l'interfaccia WrapperListener. Nel momento in cui la tua applicazione viene
avviata come servizio, usi il metodo statico start() della classe
WrapperManager per registrare il listener che hai creato (guarda la
documentazione).
Nel momento in cui l'utente ordina lo shutdown di Windows, il sistema
operativo comunica a tutte le applicazioni e a tutti i servizi di prepararsi
ad uscire. Il tuo servizio non è da meno, quindi riceverai sulla tua
interfaccia una chiamata a controlEvent() con argomento uguale alla costante
WrapperManager.WRAPPER_CTRL_SHUTDOWN_EVENT . In quel momento puoi iniziare a
fare le azioni che ritieni necessarie, tenendo però conto che:
1) non puoi avviare altri processi (Windows lo impedisce)
2) devi cercare di concludere il lavoro in fretta. Windows considera la tua
applicazione "morta" se non esce o non risponde entro 20 secondi circa
dall'arrivo del segnale. Se ti serve più tempo, comunicalo al sistema
operativo richiamando periodicamente WrapperManager.signalStopping() e
indicando quanto tempo ancora ti serve (in millisecondi).
3) concluso il lavoro, ricordati di comunicarlo tramite
WrapperManager.stop().
HTH
-- 
Fermiamo Scientology prima che sia troppo tardi!!!
http://xenu.com-it.net
 - 
http://www.xenu.net
(per rispondere personalmente leva IlDitoDalCulo)

 Non in java.
Per completare il thread, voglio segnalare che a seguito della mia 
richiesta sul ng, ho scoperto che, in realà, basta registrare, IN JAVA, 
uno "shutdown hook", anche se è molto più elegante usare Java Service 
Wrapper, come suggeriva molto cortesemente Ech3l0n.
Per chi fosse interessato, il codice seguente viene viene eseguito 
quando l'applicazione viene chiusa in maniera "normale",(credo a seguito 
di System.exit()) (inclusa la situazione in cui viene iniziato lo 
shutdown del S.O. il logout dell'utente):
  Runtime.getRuntime().addShutdownHook(new Thread()
         {
             public void run()
             {
                 System.out.println("Inizio operazioni di chiusura");
                 //operazioni di chiusura
                 System.out.println("fine operazioni di chiusura");
             }
         });
W l'umiltè!!

 W l'umiltè!!
Appunto...
ehm...ti faccio solo notare che nel tuo post originale hai scritto:
"Ho un programmino che dovrebbe eseguire delle operazioni allo
  shutdown del sistema (microsoft windows)..."
  ^^^^^^^^^^^^^^^^^^^^
Ora, gli "shutdown hook" di Java *non* fanno quello che hai chiesto tu
(o almeno quello che dal tuo messaggio si capiva volessi fare) infatti,
come si evince dalla documentazione del JDK:
"...when the virtual machine begins its shutdown sequence it will start all
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  registered shutdown hooks in some unspecified order and let them run
  concurrently..."
cioe', gli "shutdown hook" vengono attivati allo shutdown della JVM,
evento che *non* e' *necessariamente* correlato con lo shutdown
del sistema sul quale la JVM "gira" (windows o altri che siano).
Tutto questo per dire che la risposta di Vincent Vega era corretta:
*non* esiste un modo "pure Java" per intercettare un *vero* shutdown di
sistema ed "agganciare" a tale evento del codice di cleanup.
Esiste sicuramente il modo di farlo, ma questo comporta l'utilizzo
di librerie native e quindi si perde in portabilita': Java Service
Wrapper cerca di fornire il piu' vasto supporto possibile per i
sistemi operativi correntemente in uso, ma e' comunque una libreria
basata su codice nativo!
Se invece quello che intendevi era "...allo shutdown della JVM", allora
gli "shutdown hook" *sono* quello che fa per te, ma allora non si capisce
perche' hai voluto specificare esplicitamente il sistema operativo... ;)
Saluti
Roberto

  ^^^^^^^^^^^^^^^^^^^^
Senza scomodare troppo Java che in questo caso, come ti è stato già suggerito 
non può intercettare (a grandi linee) lo shutdown del sistema operativo, ti 
sarebbe bastato fare un paio di cosette:
1) postare nel ng microsoft tra gli amministratori di sistema (oppure 
consultare le varie risorse online su microsoft technet)
2) oppure con un po' di immaginazione, ipotizzando che sia in ambiente 
NT/2000/XP, aprendo start > esegui > mmc.exe, crei una console di 
configurazione, aggiungi i giusti snap-in e specifichi le azioni da effettuare 
al momento dello shutdown di sistema...
Che si concretizza in una chiamata da parte del sistema operativo a dei file 
di script (.vbs, ...), eseguibili (.exe) o meglio ancora i Batch (.bat ---> 
che in questo caso semplicemente con un java TuoProgrammaDiCleaning risolvi 
elegantemente)
Il risultato ottenuto è molto efficace (ti parlo ora di winXp) quando l'utente 
richiama lo shutdown, il sistema, dopo aver smontato l'intefaccia grafica, e 
passato il controllo a winlogon.exe, esegue i tuoi script (facendo apparire 
"Esecuzione Script utente..."), ovviamente dovrai tenere presente che se lanci 
script troppo lunghi windows rimarrà fermo fino alla fine di questi! :)
Spero di esserti stato di aiuto,
JRed
PS: Stessa cosa per lo startup...ma in genere bisogna fare più attenzione! :D

 (come scoprire quando viene chiusa la JVM in esecuzione, 
Questa non so se ti rendi conto ma è tutta un'altra domanda. Vedo ti sei
già risposto (naturalmente con molta umiltè).

 W l'umiltč!!
Come ti č stato fatto notare, la tua domanda iniziale non č affatto
questa (e ti garantisco che c'č differenza).
La risposta giusta nasce dal porre la domanda giusta. Permettimi di
rispedire al mittente questo saccente invito all'umiltč.