Basic Univers
; Attention, ce code va nécessairement fermer vos applications en cours
; même si vous choisissez d'annuler la fermeture de la session ou de Window

; A noter que vous n'avez que quelques secondes pour agir et annuler l'opération.
; Donc cliquez sur NON dès l'affichage de la Boite de Dialogue!

; Il faut lancer ce code puis lancer une fermeture de Window ou un arrêt de window
; une boite de dialogue vous permettra d'annuler cette opération mais il faudra répondre
; au plus vite à l'affichage de cette boite!

; Nico
; Le 151104
; PureBasic 3.92
; Ce code permet de savoir si Window ferme la session en cours ou
; si l'ordinateur va s'éteindre et de prendre des mesures.

#ENDSESSION_LOGOFF = $80000000

Procedure ProcedureCallback(WindowID, Message, wParam, lParam)
  Resultat = #PB_ProcessPureBasicEvents
  Select Message
    Case #WM_QUERYENDSESSION
      If lParam = 0                       ; Window se ferme
        result = MessageRequester("Info", "Window est en cours d'arrêt, l'autoriser ?", #PB_MessageRequester_YesNo )
         
      ElseIf lParam = #ENDSESSION_LOGOFF   ; Fin de session
        result = MessageRequester("Info", "Window va fermer cette Session, l'autoriser ?", #PB_MessageRequester_YesNo )
       
      EndIf

      If result = 6              ; Autorisation de Fermeture
        ; Si vous voulez faire une sauvegarde des données avant la fermeture
        ; la faire maintenant
        ProcedureReturn #True
      ElseIf result = 7          ; Annulation de Fermeture
        ProcedureReturn #False
      EndIf
  EndSelect
  ProcedureReturn Resultat
EndProcedure


Enumeration
  #Window
EndEnumeration

If OpenWindow(#Window, 0, 0, 400, 400, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Pure Basic")
 
  SetWindowCallback(@ProcedureCallback())

  Repeat
    EventID.l = WaitWindowEvent()
    Select EventID
      Case #WM_CLOSE
        Quit = 1
    EndSelect
  Until Quit = 1
EndIf