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?

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