Seite 1 von 2

Herunterfahren/Abmelden verhindern

Verfasst: 07.05.2007 16:56
von Jilocasin
Ja, ich weiß dazu gibt es im CodeArchiv etwas, allerdings funktioniert der Code nur halbwegs...
Das Herunterfahren wird zwar verhindert, aber alle laufenden Anwendungen werden dennoch beendet.

Ich hab mal ein wenig dran rumgetüftelt und noch ein Interface drangebaut...

Hoffe, man kanns gebrauchen :mrgreen:

Code: Alles auswählen

LoadFont(0, "Arial", 10, #PB_Font_Bold)
OpenWindow(0, 0, 0, 300, 300, "Der Verhinderer", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)

CreateGadgetList(WindowID(0))
CheckBoxGadget(0, 10, 10, 280, 20, "Abmelden verhindern")
  SetGadgetFont(0, FontID(0))
CheckBoxGadget(1, 10, 30, 280, 20, "Herunterfahren verhindern")
  SetGadgetFont(1, FontID(0))

TextGadget(#PB_Any, 10, 60, 280, 20, "Log:")
ListIconGadget(2, 10, 80, 280, 210, "Zeitpunkt", 100)
  AddGadgetColumn(2, 1, "Anfrage", 100)

Procedure MyWindowCallback(WindowID, Message, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents
  
  If Message = #WM_QUERYENDSESSION
    If lParam = 0 ; Shutdown
      If GetGadgetState(1)
        Result = #False
        AddGadgetItem(2, -1, FormatDate("%hh:%ii:%ss", Date()) + Chr(10) + "Herunterfahren")
      Else
        Result = #True
      EndIf
    Else ; Logoff
      If GetGadgetState(0)
        Result = #False
        AddGadgetItem(2, -1, FormatDate("%hh:%ii:%ss", Date()) + Chr(10) + "Abmelden")
      Else
        Result = #True
      EndIf
    EndIf
  EndIf
  
  If Message = #WM_ENDSESSION
    Result = 0 ; Hier ist's schon zu spät xD
  EndIf
  
  
  ProcedureReturn Result
EndProcedure


SetProcessShutdownParameters_($4FF, 0)

SetWindowCallback(@MyWindowCallback())


hIco = ExtractIcon_(0, "Shell32.dll", 27)

Repeat
  EventID = WaitWindowEvent()
  
  If GetWindowState(0) = #PB_Window_Minimize And IsSysTrayIcon(0) = 0
    HideWindow(0, 1)
    AddSysTrayIcon(0, WindowID(0), hIco)
      SysTrayIconToolTip(0, "Der Verhinderer")
  EndIf
  
  If EventID = #PB_Event_SysTray
    SetWindowState(0, #PB_Window_Normal)
    HideWindow(0, 0)
    SetForegroundWindow_(WindowID(0))
    RemoveSysTrayIcon(0)
  EndIf
  
  If EventID = 16
    If MessageRequester("Frage", "Wollen Sie das Programm wirklich beenden?", #PB_MessageRequester_YesNo + 64) = #PB_MessageRequester_Yes
      End
    EndIf
  EndIf
  
ForEver
Noch eine Frage...
Wie kann ich das hIco vom ExtractIcon_() wieder freigeben?

Verfasst: 07.05.2007 23:33
von ts-soft
>> Wie kann ich das hIco vom ExtractIcon_() wieder freigeben?

Code: Alles auswählen

DestroyIcon_(hIco)

Verfasst: 08.05.2007 15:21
von Jilocasin
Aah danke
Habs schon mit CloseHandle_() und DeleteObject_() versucht, aber auf den Trichter bin ich nicht gekommen :lol:

Verfasst: 08.05.2007 22:17
von DataMiner
Du solltest die Systemvoraussetzungen nennen, unter denen
SetProcessShutdownParameters
funktioniert.

Verfasst: 09.05.2007 14:07
von Jilocasin
Nunja, ees funktioniert laut MSDN unter...
Windows Vista
Windows XP
Windows 2000 Professional
Windows NT
Windows Server "Longhorn"
Windows Server 2003
Windows 2000 Server.


Gut ok, Windows 98 bzw 95 wird leider nicht unterstützt aber um ehrlich zu sein, benutzt du sowas noch? :|

Dass Linux nicht geht und Mac ist ja schon beinahe abzulesen an den API-Befehlen

Verfasst: 10.05.2007 09:53
von Kai
Bringt nur leider nix wenn man eingestellt hat das Windows herunterfahren soll ohne überhaupt die #WM_QUERYENDSESSION Message an denn Programmen zu senden.

Vieleicht funktioniert da das direkte abfragen zb mit GetSystemMetrics_(2000) in einen kurzen intervall besser.

Verfasst: 13.05.2007 12:31
von DataMiner
Zum Einen funktioniert GetSystemMetrics_(2000) nur ab XP, zum Anderen: warum sollte man sein System so einstellen, dass keine #WM_QUERYENDSESSION Message mehr gesendet wird?

Verfasst: 13.05.2007 17:20
von Kai
DataMiner hat geschrieben:Zum Einen funktioniert GetSystemMetrics_(2000) nur ab XP, zum Anderen: warum sollte man sein System so einstellen, dass keine #WM_QUERYENDSESSION Message mehr gesendet wird?
Das es erst ab XP funktioniert wusste ich nicht,
woher auch, kenn ja nicht mal die Konstante für 2000.
Aber es gibt nen Herunterfahrenmodus bei denn zb einige Installationsprogramme usw. benutzen bei dem Windows Programme sofort beendet und garnicht erst die Message schickt.
Da kann das Programm dann au nicht viel machen.

Verfasst: 13.05.2007 17:26
von ts-soft
Solche Installationsprogramme sind mir noch nicht untergekommen :mrgreen:
Wieviel klagen bekommt der Hersteller täglich? Wenn die Firma in den USA
sitzt, werden die wohl schon lange Pleite sein, da gehts ja schnell in die Höhe.

Verfasst: 13.05.2007 18:18
von bluejoke
Gibts nicht ne Option "schnelles Herunterfahren" oder so? Kanns nicht sein, dass es das ist?