Seite 1 von 1

Verfasst: 22.09.2006 17:42
von ts-soft
Ist doch simple :wink:

Code: Alles auswählen

Procedure CallBack(hWnd.l, Msg.l, wParam.l, lParam.l)
  If Msg = #WM_QUERYENDSESSION
    ; Mach was und beeil Dich ;)
  EndIf
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

If OpenWindow(0, #PB_Ignore, 0, 200, 200, "")
  SetWindowCallback(@CallBack())
  
  ; weiterer Code
EndIf
// Nachtrag:
Hab den Code mal ein bißchen erweitert. Ob man jetzt auf den Button
klickt um Windows zu beenden, oder Start/Computer ausschalten, ist
egal, die MessageBox sollte erscheinen.

PS: es empfiehlt sich den Source zu speichern, bevor man beendet :wink:

Code: Alles auswählen

Procedure EnableShutDown()
  Privileges.TOKEN_PRIVILEGES
  OpenProcessToken_(GetCurrentProcess_(), 40, @hToken)
  Privileges\PrivilegeCount           = 1
  Privileges\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED
  LookupPrivilegeValue_(0, "SeShutdownPrivilege", @Privileges\Privileges[0]\Luid)
  AdjustTokenPrivileges_(hToken, 0, @Privileges, 0, 0, 0)
  CloseHandle_(hToken)
EndProcedure

Procedure Shutdown(Flags.l)
  EnableShutDown()
  ExitWindowsEx_(Flags, 0)
EndProcedure

Procedure Callback(hWnd.l, Msg.l, wParam.l, lParam.l)
  
  Select Msg
    Case #WM_QUERYENDSESSION
      MessageRequester("", "Achtung, Windows wird beendet")
  EndSelect
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

If OpenWindow(0, #PB_Ignore, 0, 130, 50, "")
  If CreateGadgetList(WindowID(0))
    ButtonGadget(0, 10, 10, 100, 25, "Shutdown")
  EndIf
EndIf

SetWindowCallback(@Callback())

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      If EventGadget() = 0
        Shutdown(#EWX_SHUTDOWN | #EWX_FORCE)
      EndIf
  EndSelect
ForEver