Seite 1 von 1

Verfasst: 22.09.2006 12:20
von bobobo
oder Grupenrichtlinienedtor benutzen
http://www.windowspage.de/frame.php?htt ... pedit.html

unter
---Windows-Einstellungen
---------Skripts (Start/Herunterfahren)

Verfasst: 22.09.2006 12:35
von ts-soft
Einfach eine Verknüpfung in den Autostart-Ordner, dann startet das
Programm mit Windows. Im Callback #WM_QUERYENDSESSION abfangen,
dann kann man noch schnell was machen, bevor Windows zuende ist (aber
sehr schnell)
Sollte IMHO der einfachste und sauberste Weg sein, wenns denn ausreicht :wink:

Verfasst: 22.09.2006 17:18
von PMTheQuick
Hmmm... Das Callback ist wohl die beste, da es auchfür andere PC's sein soll, und ohne grossen Aufwan laufen soll! ZU Autostart Ordner weiss ich... ZU dem Callback..-. Hat jemand ein Beispiel auf Lager? :D

Gruss
PMTheQuick ;)

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