Programm reagiert nicht beim Herunterfahren von Windows

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
bEEtzY
Beiträge: 27
Registriert: 03.02.2005 23:46

Programm reagiert nicht beim Herunterfahren von Windows

Beitrag 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()
Zuletzt geändert von bEEtzY am 16.10.2008 13:06, insgesamt 1-mal geändert.
solong IRL
bEEtzY

Bild
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Code-Tags und einrücken bitte, sonst guck ich mir das gar nicht an.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag 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
PB 4.61 | Windows Vista - 32Bit
Homepage

"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ß
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Guter Einwand, Josef...

@beetzy
Liste der Message-Konstanten:
http://www.purebasic.fr/english/viewtopic.php?t=28663
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag 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.
PB 4.61 | Windows Vista - 32Bit
Homepage

"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ß
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

Beitrag 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.
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
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag 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.
PB 4.61 | Windows Vista - 32Bit
Homepage

"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ß
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

Beitrag 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 :mrgreen:
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
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag von Josef Sniatecki »

Oh :oops: . Trotzdem gut zu wissen :D
PB 4.61 | Windows Vista - 32Bit
Homepage

"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ß
Antworten