Seite 1 von 2
Programm reagiert nicht beim Herunterfahren von Windows
Verfasst: 16.10.2008 12:23
von bEEtzY
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!)?
Code: Alles auswählen
Procedure MyWindowCallback(WindowID, Message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
If Message = #WM_CLOSE
End
EndIf
ProcedureReturn Result
EndProcedure
Procedure Programm()
Repeat
Delay(1000)
...
ForEver
EndProcedure
SetWindowCallback(@MyWindowCallback())
Programm()
Verfasst: 16.10.2008 12:36
von Fluid Byte
Code-Tags und einrücken bitte, sonst guck ich mir das gar nicht an.
Verfasst: 16.10.2008 13:56
von Kaeru Gaman
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.
Verfasst: 16.10.2008 14:28
von Josef Sniatecki
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.
Ist nur eine Vermutung.
mfg Josef
Verfasst: 16.10.2008 14:29
von Kaeru Gaman
Guter Einwand, Josef...
@beetzy
Liste der Message-Konstanten:
http://www.purebasic.fr/english/viewtopic.php?t=28663
Verfasst: 16.10.2008 14:44
von Josef Sniatecki
Ich habe den Code gefunden:
Code: Alles auswählen
; 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.
Verfasst: 16.10.2008 14:51
von ts-soft
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.
Verfasst: 16.10.2008 14:54
von Josef Sniatecki
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.
Verfasst: 16.10.2008 14:57
von ts-soft
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

Verfasst: 16.10.2008 15:04
von Josef Sniatecki
Oh

. Trotzdem gut zu wissen
