Ist doch simple
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
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