wie kann ich das Beenden eines Programms beim Herunterfahren von Windows realisieren, ich habe es über die EventWindowCallBack Funktion probiert, aber anscheinend wird die CallBack Funktion gar nicht ausgeführt, denn es kommt zu der bekannten Windowsfehlermeldung "Programm reagiert nicht".
Ist das Problem vielleicht, dass das Programm weder aus der Console noch mit einem Fenster läuft (ist nur als Prozess und nicht als Anwendung im Taskmanager zu sehen!)?
ich hab keinen Plan, ob für das verarbeiten einer Message per Callback ne Event-Abfrage in der Hauptschleife nötig ist...
aber grundsätzlich ist ein fehlendes (Wait)WindowEvent die Ursache dafür, dass das Programm als "reagiert nicht" eingestuft wird.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Ich kann mich erinnern, dass ich dieses Konzept mal im CodeArchiv
gesehen habe. Ich bin mir sicher, dass es nicht die Konstante
"WM_CLOSE" ist, sondern irgendwas wie "WM_SHUTDOWN" oder
ähnliches.
Du kannst ja einfach die Variable "Message" debuggen, um den Wert
für das Herunterfahren zu ermitteln. Später kannst du dann
unter dem Konstanten-Viewer nachschauen, welche Konstante "WM..."
zum Wert passt.
"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=2328&highlight=
; Author: dige (updated for PB4.00 by blbltheworm)
; Date: 18. September 2003
; OS: Windows
; Demo: No
; Erklärung:
; Wenn Windows vom Nutzer heruntergefahren wird oder der Nutzer sich
; abmeldet und dies nicht mit der Option FORCE geschieht, wird an alle
; laufenden Prozesse eine #WM_QUERYENDSESSION Message gesendet.
;
; Diese ist mit #True oder #False zu beantworten. Wird allerdings ein
; #False übergeben, wird der Shutdown Prozess komplett abgebrochen!
;
; Dies kann man verwenden um ein Programm rechtzeitig sauber zu beenden
; oder den Shutdown Prozess abzufangen...
Procedure.b TerminateProgram()
Shared Quit.b
; Wird bei Windows-Shutdown aufgerufen
If MessageRequester( "Windows Shutdown", "Windows wirklich beenden?", #MB_ICONEXCLAMATION | #MB_YESNO ) = 6
Quit.b = 1
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure WindowsCallback(WindowID, Message, wParam, lParam)
If Message = #WM_QUERYENDSESSION
ProcedureReturn TerminateProgram()
Else
ProcedureReturn #PB_ProcessPureBasicEvents
EndIf
EndProcedure
OpenWindow( 0,90,90,300,100, "Warte auf Windows Shutdown" ,#PB_Window_SystemMenu)
SetWindowCallback(@WindowsCallback())
Repeat
Event = WindowEvent()
Delay ( 100 )
Until Quit.b Or Event = #PB_Event_CloseWindow
Es war also das Event "#WM_QUERYENDSESSION". Gibt man ein
True in diesem CallBack zurück. Wird Windows ungehindert
heruntergefahren. Mit False hält man das Herunterfahren an.
"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Fensterlose Anwendung kann keine Fensterevents verarbeiten, auch nicht
in einem Callback. Zumindest ein Hidden-Fenster ist erforderlich.
Problem ist mir sowieso nicht klar, das beenden übernimmt doch Windows,
wenns beendet wird.
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.
ts-soft hat geschrieben:Fensterlose Anwendung kann keine Fensterevents verarbeiten, auch nicht
in einem Callback. Zumindest ein Hidden-Fenster ist erforderlich.
Problem ist mir sowieso nicht klar, das beenden übernimmt doch Windows,
wenns beendet wird.
Klar macht Windows alle Aufräumarbeiten. Doch für einen Editor
ist das z.B. sehr hilfreich. Denn damit kann ich den Benutzer noch
schnell nachfragen, ob er sein Dokument vor dem
Herunterfahren speichern möchte.
"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Josef Sniatecki hat geschrieben:
Klar macht Windows alle Aufräumarbeiten. Doch für einen Editor
ist das z.B. sehr hilfreich. Denn damit kann ich den Benutzer noch
schnell nachfragen, ob er sein Dokument vor dem
Herunterfahren speichern möchte.
bEEtzY hat geschrieben:Ist das Problem vielleicht, dass das Programm weder aus der Console noch mit einem Fenster läuft
Es gibt kein Fenster, also keine Fenstermessages, #WM_QUERYENDSESSION
hilft da auch nicht weiter
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.
"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß