[Erledigt]PB Programm soll auf das Herunterfahren reagieren

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
tft
Beiträge: 605
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

[Erledigt]PB Programm soll auf das Herunterfahren reagieren

Beitrag 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
Zuletzt geändert von tft am 05.04.2021 13:25, insgesamt 1-mal geändert.
TFT seid 1989 , Turgut Frank Temucin , Dachsen/Berlin/Antalya
Aktuelles Projekte : Driving School Evergarden
YouTube : Pure Basic to go
FaceBook : Temuçin SourceMAgic Games
DISCORD : SourceMagic
W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
tft
Beiträge: 605
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Beitrag 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
TFT seid 1989 , Turgut Frank Temucin , Dachsen/Berlin/Antalya
Aktuelles Projekte : Driving School Evergarden
YouTube : Pure Basic to go
FaceBook : Temuçin SourceMAgic Games
DISCORD : SourceMagic
W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Benutzeravatar
Dave
Beiträge: 22
Registriert: 12.06.2011 21:39
Computerausstattung: Windows 10 x64, Intel Core i7 7700k @4.2Ghz, 16GB RAM, PureBasic 5.72

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Beitrag 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
Bild Bild Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Beitrag 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.
Bild
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Beitrag von Nino »

Ist dieses Thema hier nicht schon ein halbes Dutzend mal diskutiert worden? :roll:
Benutzeravatar
tft
Beiträge: 605
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Beitrag von tft »

mag sein ...... aber die Suchfunktion ist unterirdisch .Zumindestens bei mir. Wenn du einen Link hast. Immer her damit.

Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , Dachsen/Berlin/Antalya
Aktuelles Projekte : Driving School Evergarden
YouTube : Pure Basic to go
FaceBook : Temuçin SourceMAgic Games
DISCORD : SourceMagic
W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Beitrag 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.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Beitrag 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. :-)
Benutzeravatar
dige
Beiträge: 1182
Registriert: 08.09.2004 08:53

Re: Ein PB Programm soll auf das Herunterfahren reagieren

Beitrag 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
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Antworten