Hallo, das ist der Code der Originalversion, die ebenfalls nach Kompilierung mit einer 5er Version auf dem Win7-32bit-PC abstürzt. Ich hoffe, dass der Code nicht zu lang und zu blöd ist.
Code: Alles auswählen
; WinExit
; schneller Ausstieg aus Windows
;- Version Constants
#FF_Name=" WinExit"
#FF_Version="4.1"
#FF_Date="01/13"
#FF_Delay=1000
;- Window Constants
;
Enumeration
#Window_0
#Window_1
EndEnumeration
;- Gadget Constants
Enumeration
; vom Hauptdialog
#Button_Ueber
#Image_0
#Text_0
#Button_Abmelden
#Button_Ausschalten
#Button_Ruhezustand
#Button_Energiesparmodus
#Button_Neustart
#Button_Abbruch
#CheckBox_Erzwingen
#CheckBox_temp
#CheckBox_save
EndEnumeration
Enumeration
; vom Unterdialog
#Text_1
EndEnumeration
;- Menu Constants
Enumeration
#Shortcut_0
#Shortcut_1
EndEnumeration
;- Fonts
Global FontID1
FontID1 = LoadFont(1, "Arial", 10, #PB_Font_Bold)
Global FontID2
FontID2 = LoadFont(2, "Arial", 10)
;- Image Plugins
;- Image Globals
Global Image0
;- Catch Images
Image0 = CatchImage(0, ?Image0)
;- Images
DataSection
Image0:
IncludeBinary "d:\ff\!purebasic\Winexit\winexit.ico"
EndDataSection
;- sonstige globale Variablen
Global schluss.b, inifile.s, tempdir.s
;- ExitWindowsEx uFlags-Konstanten
#EWX_LOGOFF = 0 ; Meldet sich neu am Netzwerk an
#EWX_SHUTDOWN = 1 ; Fährt den Computer herunter
#EWX_REBOOT = 2 ; Startet den Computer neu
#EWX_FORCE = 4 ; Beendet alle Programme ohne Aufforderung an den Benutzer
#EWX_POWEROFF = 8 ; Fährt den Computer herunter und schaltet ihn ab, wenn möglich
Procedure InfoDial()
Protected neuezeile.s=Chr(13)+Chr(10), zeile1.s, zeile2.s, zeile3.s, l_zeile1.b, l_zeile2.b, l_zeile3.b, max.b
zeile1=#FF_Name + " v" + #FF_Version
zeile2="(C) by FF " + #FF_Date
zeile3="written in PureBasic"
l_zeile1=Len(zeile1)
l_zeile2=Len(zeile2)
l_zeile3=Len(zeile3)
If l_zeile2 >= l_zeile1
max=l_zeile2
Else
max=l_zeile1
EndIf
If l_zeile3 >= max
max=l_zeile3
EndIf
zeile1=Space((max-l_zeile1)/2) + zeile1
zeile2=Space((max-l_zeile2)/2) + zeile2
zeile3=Space((max-l_zeile3)/2) + zeile3
MessageRequester("Info", zeile1 + neuezeile + zeile2 + neuezeile + zeile3)
EndProcedure
Procedure SubDial(openclose.b, action.b = 0)
Protected meldung.s
Select openclose
Case 1 ; open
Select action
Case 1
meldung="BenutzerIn wird abgemeldet..."
Case 2
meldung="Windows wird heruntergefahren..."
Case 3
meldung="Windows geht in den Ruhezustand..."
Case 4
meldung="Windows geht in den Energiesparmodus"
Case 5
meldung="Windows wird neu gestartet..."
Case 6
meldung="Leere das Temp-Verzeichnis..."
EndSelect
If OpenWindow(#Window_1, 386, 273, 276, 37, "WinExit", #PB_Window_TitleBar | #PB_Window_ScreenCentered )
TextGadget(#Text_1, 15, 10, 245, 20, meldung, #PB_Text_Center)
SetGadgetFont(#Text_1, FontID2)
EndIf
Case 2 ; close
CloseWindow(#Window_1)
EndSelect
EndProcedure
; nicht direkt aufrufbare API-Funktion SetSuspendState
; schaltet den Ruhezustand/Energiesparmodus ein
Procedure Suspend(Hibernate, ForceCritical=#False, DisableWakeEvent=#False)
Protected LibraryID
Protected Result = #False
LibraryID = OpenLibrary(#PB_Any, "powrprof.dll")
If LibraryID
Result = CallFunction(LibraryID, "SetSuspendState", Hibernate, ForceCritical, DisableWakeEvent)
CloseLibrary(LibraryID)
EndIf
ProcedureReturn Result
EndProcedure
; nicht direkt aufrufbare API-Funktion IsPwrSuspendAllowed
; testet, ob der Energiesparmodus zur Verfügung steht
Procedure SuspendAllowed()
Protected LibraryID
Protected Result = #False
LibraryID = OpenLibrary(#PB_Any, "powrprof.dll")
If LibraryID
Result = CallFunction(LibraryID, "IsPwrSuspendAllowed")
CloseLibrary(LibraryID)
EndIf
ProcedureReturn Result
EndProcedure
; nicht direkt aufrufbare API-Funktion IsPwrHibernateAllowed
; testet, ob der Ruhezustand zur Verfügung steht
Procedure HibernateAllowed()
Protected LibraryID
Protected Result = #False
LibraryID = OpenLibrary(#PB_Any, "powrprof.dll")
If LibraryID
Result = CallFunction(LibraryID, "IsPwrHibernateAllowed")
CloseLibrary(LibraryID)
EndIf
ProcedureReturn Result
EndProcedure
Procedure SetShutDownPrivileges()
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
; Verzeichnis leeren (alle Dateien und Unterverzeichnisse löschen
Procedure.l FlushDir(what_dir.s)
Protected dir.l, name.s, fullpath.s
; Parameter übergeben?
If what_dir <> ""
; Verzeichnisuntersuchung beginnen
dir = ExamineDirectory(#PB_Any, what_dir, "")
; Verzeichnis kann untersucht werden
If dir
; Verzeichniseinträge durchgehen
While NextDirectoryEntry(dir)
; Namen des Eintrages ermitteln
name = DirectoryEntryName(dir)
; Punkteinträge übergehen
If name <> "." And name <> ".."
; kompletten Pfad zusammenbasteln
fullpath = what_dir + name
; es ist ein Verzeichnis
If DirectoryEntryType(dir) = #PB_DirectoryEntry_Directory
; löschen
DeleteDirectory(fullpath, "*.*", #PB_FileSystem_Recursive | #PB_FileSystem_Force)
; es ist eine Datei
Else
; Dateiattribute zurücksetzen und Datei löschen
SetFileAttributes(fullpath, #PB_FileSystem_Normal)
DeleteFile(fullpath)
EndIf
EndIf
Wend
; Verzeichnisuntersuchung beenden
FinishDirectory(dir)
EndIf
EndIf
EndProcedure
Procedure HandleInifile(startstop.b)
Select startstop
; Programmstart
Case 1
; Pfad zur ini-Datei vorhanden
If inifile <> ""
; es gibt schon eine ini-Datei
If FileSize(inifile) >= 0
; ini-Datei öffnen, Verarbeitung starten
OpenPreferences(inifile)
; es gibt die Gruppe 'winexit'
If PreferenceGroup("winexit")
; Stati der Gadgets setzen
SetGadgetState(#CheckBox_Erzwingen, ReadPreferenceInteger("erzw", 0))
SetGadgetState(#CheckBox_temp, ReadPreferenceInteger("tmp", 0))
SetGadgetState(#CheckBox_save, ReadPreferenceInteger("save", 0))
EndIf
; Verarbeitung beenden, ini-Datei schließen
ClosePreferences()
; es gibt noch keine ini-Datei
Else
; ini-Datei neu anlegen, Verarbeitung starten
CreatePreferences(inifile)
; Gruppe anlegen, Werte initialisieren
PreferenceGroup("winexit")
WritePreferenceInteger("erzw", 0)
WritePreferenceInteger("tmp", 0)
WritePreferenceInteger("save", 0)
; Verarbeitung beenden, ini-Datei schließen
ClosePreferences()
EndIf
EndIf
; Programmende
Case 2
; Einstellungen sollen gespeichert werden
If GetGadgetState(#CheckBox_save)
; ini-Datei öffnen, Verarbeitung starten
OpenPreferences(inifile)
; es gibt die Gruppe 'winexit'
If PreferenceGroup("winexit")
; Stati der Gadgets in ini-Datei schreiben
WritePreferenceInteger("erzw", GetGadgetState(#CheckBox_Erzwingen))
WritePreferenceInteger("tmp", GetGadgetState(#CheckBox_temp))
WritePreferenceInteger("save", GetGadgetState(#CheckBox_save))
EndIf
; Verarbeitung beenden, ini-Datei schließen
ClosePreferences()
EndIf
EndSelect
EndProcedure
Procedure MainDial()
If OpenWindow(#Window_0, 528, 279, 220, 318, "Windows verlassen...", #PB_Window_TitleBar | #PB_Window_ScreenCentered )
; Dialog aufbauen
ButtonGadget(#Button_Ueber, 190, 5, 20, 20, "...")
GadgetToolTip(#Button_Ueber, "Info zum Programm")
SetGadgetFont(#Button_Ueber, FontID1)
ImageGadget(#Image_0, 15, 10, 32, 32, Image0)
TextGadget(#Text_0, 55, 20, 125, 15, "...und zwar wie?", #PB_Text_Center)
SetGadgetFont(#Text_0, FontID1)
ButtonGadget(#Button_Abmelden, 10, 50, 200, 30, "Ab- und wieder anmelden")
GadgetToolTip(#Button_Abmelden, "Schnelles Ab- und wieder Anmelden")
SetGadgetFont(#Button_Abmelden, FontID2)
ButtonGadget(#Button_Ausschalten, 10, 85, 200, 30, "Herunterfahren / ausschalten", #PB_Button_Default)
GadgetToolTip(#Button_Ausschalten, "Fährt den PC herunter und schaltet ihn aus, wenn möglich")
SetGadgetFont(#Button_Ausschalten, FontID2)
ButtonGadget(#Button_Ruhezustand, 10, 120, 200, 30, "Ruhezustand")
GadgetToolTip(#Button_Ruhezustand, "Speichert die Sitzung auf der Festplatte und fährt den PC herunter")
SetGadgetFont(#Button_Ruhezustand, FontID2)
If HibernateAllowed() = #False
DisableGadget(#Button_Ruhezustand, 1)
EndIf
ButtonGadget(#Button_Energiesparmodus, 10, 155, 200, 30, "Energiesparmodus")
GadgetToolTip(#Button_Energiesparmodus, "Speichert die Sitzung im Arbeitsspeicher und schaltet Energiesparmodus ein")
SetGadgetFont(#Button_Energiesparmodus, FontID2)
If SuspendAllowed() = #False
DisableGadget(#Button_Energiesparmodus, 1)
EndIf
ButtonGadget(#Button_Neustart, 10, 190, 200, 30, "Neustart")
GadgetToolTip(#Button_Neustart, "Startet den PC neu")
SetGadgetFont(#Button_Neustart, FontID2)
ButtonGadget(#Button_Abbruch, 10, 225, 200, 30, "Abbruch")
SetGadgetFont(#Button_Abbruch, FontID2)
CheckBoxGadget(#CheckBox_Erzwingen, 10, 261, 200, 15, "Vorgang erzwingen (Vorsicht!)")
GadgetToolTip(#CheckBox_Erzwingen, "Bei den Optionen 1, 2 und 5 wird NICHT auf die Reaktion evtl. noch laufender Programme gewartet (Datenverlust möglich)")
SetGadgetFont(#CheckBox_Erzwingen, FontID2)
CheckBoxGadget(#CheckBox_temp, 10, 280, 200, 15, "Temp-Verzeichnis leeren")
GadgetToolTip(#CheckBox_temp, "Beim Herunterfahren/Neustart immer das Temp-Verzeichnis leeren")
SetGadgetFont(#CheckBox_temp, FontID2)
CheckBoxGadget(#CheckBox_save, 10, 299, 200, 15, "Einstellungen speichern")
GadgetToolTip(#CheckBox_save, "WinExit merkt sich die Einstellungen")
SetGadgetFont(#CheckBox_save, FontID2)
; Shortcuts für Default-Button und Abbruch hinzufügen
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Return, #Shortcut_0)
AddKeyboardShortcut(#Window_0, #PB_Shortcut_Escape, #Shortcut_1)
; Flag für Aktionen beim Programmende
schluss = #False
; kompletter Pfad zur ini-Datei im Programmverzeichnis
inifile = GetPathPart(ProgramFilename()) + "winexit.ini"
; Startaktionen für die ini-Datei
HandleInifile(1)
; Temp-Verzeichnis ermitteln
tempdir = GetTemporaryDirectory()
; Ereignisschleife
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_Menu
Select EventMenu()
Case #Shortcut_0
If GetGadgetState(#CheckBox_temp)
SubDial(1, 5)
FlushDir(tempdir)
SubDial(2)
EndIf
SetShutDownPrivileges()
SubDial(1, 2)
Delay(#FF_Delay)
SubDial(2)
If GetGadgetState(#CheckBox_Erzwingen)
ExitWindowsEx_(#EWX_POWEROFF | #EWX_FORCE, 0)
Else
ExitWindowsEx_(#EWX_POWEROFF, 0)
EndIf
schluss = #True
Case #Shortcut_1
End
EndSelect
ElseIf EventID = #PB_Event_Gadget
Select EventGadget()
Case #Button_Ueber
InfoDial()
Case #Button_Abmelden
SetShutDownPrivileges()
SubDial(1, 1)
Delay(#FF_Delay)
SubDial(2)
If GetGadgetState(#CheckBox_Erzwingen)
ExitWindowsEx_(#EWX_LOGOFF | #EWX_FORCE, 0)
Else
ExitWindowsEx_(#EWX_LOGOFF, 0)
EndIf
schluss = #True
Case #Button_Ausschalten
If GetGadgetState(#CheckBox_temp)
SubDial(1, 6)
FlushDir(tempdir)
SubDial(2)
EndIf
SetShutDownPrivileges()
SubDial(1, 2)
Delay(#FF_Delay)
SubDial(2)
If GetGadgetState(#CheckBox_Erzwingen)
ExitWindowsEx_(#EWX_POWEROFF | #EWX_FORCE, 0)
Else
ExitWindowsEx_(#EWX_POWEROFF, 0)
EndIf
schluss = #True
Case #Button_Ruhezustand
If GetGadgetState(#CheckBox_temp)
SubDial(1, 6)
FlushDir(tempdir)
SubDial(2)
EndIf
SetShutDownPrivileges()
SubDial(1, 3)
Delay(#FF_Delay)
SubDial(2)
If GetGadgetState(#CheckBox_Erzwingen)
Suspend(#True, #True, #False)
Else
Suspend(#True, #False, #False)
EndIf
schluss = #True
Case #Button_Energiesparmodus
If GetGadgetState(#CheckBox_temp)
SubDial(1, 6)
FlushDir(tempdir)
SubDial(2)
EndIf
SetShutDownPrivileges()
SubDial(1, 4)
Delay(#FF_Delay)
SubDial(2)
If GetGadgetState(#CheckBox_Erzwingen)
Suspend(#False, #True, #False)
Else
Suspend(#False, #False, #False)
EndIf
schluss = #True
Case #Button_Neustart
If GetGadgetState(#CheckBox_temp)
SubDial(1, 6)
FlushDir(tempdir)
SubDial(2)
EndIf
SetShutDownPrivileges()
SubDial(1, 5)
Delay(#FF_Delay)
SubDial(2)
If GetGadgetState(#CheckBox_Erzwingen)
ExitWindowsEx_(#EWX_REBOOT | #EWX_FORCE, 0)
Else
ExitWindowsEx_(#EWX_REBOOT, 0)
EndIf
schluss = #True
Case #Button_Abbruch
End
EndSelect
EndIf
If schluss
HandleInifile(2)
End
EndIf
Until EventID = #PB_Event_CloseWindow
EndIf
EndProcedure
MainDial()
End
; IDE Options = PureBasic 5.43 LTS (Windows - x86)
; CursorPosition = 61
; FirstLine = 57
; Folding = --
; UseIcon = winexit.ico
; Executable = WinExit.exe
; EnablePurifier
; IncludeVersionInfo
; VersionField0 = 4,1,0,0
; VersionField1 = 4,1,0,0
; VersionField2 = ff
; VersionField3 = WinExit
; VersionField4 = v4.1
; VersionField5 = 4.1
; VersionField6 = WinExit - schneller Ausstieg aus Windows
; VersionField7 = WinExit
; VersionField8 = %EXECUTABLE