Beim Win2000er-Rechner in der Firma funktioniert dieser Source
von Michael Vogel ganz gut.
Code: Alles auswählen
;Autor: Michael Vogel
Procedure DoShutDown()
Protected Privileges.TOKEN_PRIVILEGES
Protected htoken
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 DoSuspend(Hibernate.l,ForceCritical.l,DisableWakeEvent)
Protected DLL=OpenLibrary(#PB_Any,"Powrprof.dll")
CallFunction(DLL,"SetSuspendState",Hibernate,ForceCritical,DisableWakeEvent)
CloseLibrary(DLL)
EndProcedure
Procedure SuspendAllowed()
Protected DLL=OpenLibrary(#PB_Any,"Powrprof.dll")
Protected Result=CallFunction(DLL,"IsPwrSuspendAllowed")
CloseLibrary(DLL)
ProcedureReturn Result
EndProcedure
Procedure HibernateAllowed()
Protected DLL=OpenLibrary(#PB_Any,"Powrprof.dll")
Protected Result=CallFunction(DLL,"IsPwrHibernateAllowed")
CloseLibrary(DLL)
ProcedureReturn Result
EndProcedure
Procedure Shutdown(mode)
Protected SaverActive = #Null
Select mode
Case 0
; Bildschirmschoner
SendMessage_(GetForegroundWindow_(),#WM_SYSCOMMAND,#SC_SCREENSAVE,0)
; ein wenig warten...
Delay(5000)
; abfragen, ob der Bildschirmschoner läuft...
If SystemParametersInfo_(#SPI_GETSCREENSAVERRUNNING,0,@SaverActive,0)
If SaverActive=0
; wenn nicht, Bildschirm abdunkeln...
SendMessage_(GetForegroundWindow_(), #WM_SYSCOMMAND, #SC_MONITORPOWER,1)
EndIf
EndIf
Case 1
; Abmelden
DoShutDown()
ExitWindowsEx_(0,0)
Case 2
; Beenden
DoShutDown()
ExitWindowsEx_(2,0)
Case 3
; Neustart
DoShutDown()
ExitWindowsEx_(9,0)
Case 4
; Ruhezustand
DoSuspend(#True,#False,#False)
Case 5
; Standby
DoSuspend(#False,#False,#False)
EndSelect
End
EndProcedure
DoShutDown()
Shutdown(2)
[Edit]
habe wohl das Netzwerk überlesen
[/Edit]