Seite 1 von 2

[Erledigt]PB Programm soll auf das Herunterfahren reagieren

Verfasst: 10.11.2020 16:07
von tft
Hallo,

ich schreibe ein PB Tool, das die ganze Zeit im Hintergrund läuft. Wenn der Rechner jetzt herunter gefahren werden soll. Möchte ich, das das Programm noch schnell Daten Speichert und Windows solange mit dem herunterfahren wartet. Bis das Programm sich beendet hat.

Wie muss ich da vorgehen?

Gruss TFT

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Verfasst: 10.11.2020 17:17
von ts-soft
Hier mal ein Einstieg:

Als erstes benötige ich das Recht zum Runterfahren: SeShutdownPrivilege, hier als kompakte Procedure:

Code: Alles auswählen

Procedure EnableShutDown()
  Protected *Privileges.TOKEN_PRIVILEGES = AllocateMemory(8 + (1 * SizeOf(LUID_AND_ATTRIBUTES)))
  Protected htoken.i
  OpenProcessToken_(GetCurrentProcess_(), #TOKEN_ADJUST_PRIVILEGES  | #TOKEN_QUERY, @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)
  FreeMemory(*Privileges)
EndProcedure
Einfach aufrufen!
Jetzt noch ein etwas längerer engl. Artikel von MS: https://docs.microsoft.com/en-us/window ... plications

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Verfasst: 10.11.2020 19:46
von tft
Hallo,

ich habe mir den Link zu gemühte geführt. Grundsätzlich habe ich die Funktionsweise des ReBoot Manager verstanden. Aber was genau ist der sinn deiner Procedure? Ich bekomme ja über das EVENT ein Signal, das der Rechner runter gefahren wird. und muss dann das Programm so beenden wie wenn jemand den CloseButton des Fensters betätigt. Und beim Beenden muss ich noch einen Signal "Ich habe fertig" erzeugen. ????? Ich möchte das das Runterfahren des Rechnet solange wartet bis Das Programm fertig ist. Das kann auch mal länger benötigen. Was ist zu tun????

Gruss TFT

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Verfasst: 10.11.2020 20:05
von Dave
Hallo

Probiers mal damit: (halt nur für Windows)

Code: Alles auswählen

EnableExplicit

Define EventID

Procedure WinCallback(hWnd, uMsg, wParam, lParam) 
  If uMsg = #WM_ENDSESSION 
    ;Windows wird heruntergefahren.
    ;Hier können noch wichtige Einstellungen gespeichert werden.
  EndIf 

  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowCallback(@WinCallback())
  
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf
Copyright RSBasic

Edit: Der Code wartet leider nicht auf dein Programm, ich hab erst jetz gelesen, dass dein Programm manchmal länger hat.

Gruss Dave

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Verfasst: 10.11.2020 22:06
von NicTheQuick
Da gibt es noch mehr Details zu beachten: https://devblogs.microsoft.com/oldnewth ... 0/?p=95855
Es gibt z.B. die Message WM_QUERYENDSESSION, nach der man mit #True oder #False antworten kann, ob Windows nun herunterfahren darf.
Und bei WM_ENDSESSION sollte man auch noch wParam überprüfen. Ist der nämlich 0, dann wird die Session gar nicht beendet. Und dann sollte man auch einfach nichts tun.

In dem Blobeintrag oben heißt es weiterhin, dass man bei WM_ENDSESSION besser keine längeren Aktivitäten ausführt, da man kurz darauf im schlechtesten Fall auch schon gekillt werden kann. Lieber macht man das alles also in WM_QUERYENDSESSION.

Da ich kein Windows habe, kann ich aber sonst nicht weiter helfen.

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Verfasst: 10.11.2020 22:28
von Nino
Ist dieses Thema hier nicht schon ein halbes Dutzend mal diskutiert worden? :roll:

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Verfasst: 11.11.2020 01:05
von tft
mag sein ...... aber die Suchfunktion ist unterirdisch .Zumindestens bei mir. Wenn du einen Link hast. Immer her damit.

Gruss TFT

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Verfasst: 11.11.2020 09:46
von HeX0R
Also ehrlich gesagt liegt das eher an einem schlecht programmierten Tool!
Einem Programm sollte es egal sein, ob der Rechner heruntergefahren wird, oder der Benutzer es einfach schließt, in beiden Fällen sendet Windows ein #WM_CLOSE (oder #PB_Event_CloseWindow) und gibt jedem Programm auch genügend Zeit zu enden.
Wenn Dein Programm natürlich irgendwo festsitzt und keine Events mehr aus der Queue zupft, kann es auch nicht schnell genug reagieren.

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Verfasst: 11.11.2020 09:56
von Nino
tft hat geschrieben:Wenn du einen Link hast. Immer her damit.
Wenn ich einen passenden Link hätte, hätte ich ihn sicherlich gleich mitgepostet. :-)

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Verfasst: 11.11.2020 11:28
von dige
Wenn Du einen 'ShutdownBlockReasonCreate' erstellst, kannst du im WindowsCallback die WM_QUERYENDSESSION Nachricht mit #Null beantworten. Dann wartet Windows auf dein Programm und du hast noch genug Zeit dein Programm sauber zu beenden..

viewtopic.php?f=3&t=25807