![]() |
Windows beendet Programm nicht
Moin!
Ich habe etliche Möglichkeiten schon durch probiert, die hier im Forum auch genannt werden, doch keine schafft es Windows nicht, mein Programm beim Herunterfahren zu beenden. Windows lässt sich folglich erst herunterfahren, wenn ich das Programm manuell beende. Hier die mir am einleuchtesten erscheinende, nicht funktionierende Möglichkeit:
Delphi-Quellcode:
Die evtl. relevanten Stellen meines Code sehen wie folgt aus:
procedure WMQUERYENDSESSION(var msg: TMessage); message WM_QUERYENDSESSION;
[...] procedure TForm1.WMQUERYENDSESSION(var msg: TMessage); begin inherited; //Falls eingestellt, dass das Programm bei Klick auf "X" minimiert werden soll MinimizeAtClose := false; //Falls eingestellt, dass Nachfrage beim Beenden erscheint AskForClose := false; msg.Result := 1; end;
Delphi-Quellcode:
//TNA - auf Mausklicks reagieren:
procedure TForm1.WndProc(var Msg: TMessage); var Point: TPoint; begin if Msg.Msg = WM_USER + 20 then begin case Msg.lParam of WM_RBUTTONDOWN: begin SetForegroundWindow(Handle); GetCursorPos(Point); PopUpMenu1.PopUp(Point.X, Point.Y); end; WM_LBUTTONDBLCLK: begin Form1.Show; Shell_NotifyIcon(NIM_DELETE, @IconData); end; end; end; inherited; end;
Delphi-Quellcode:
//Beim Minimieren Icon in TNA:
procedure TForm1.WMSysCommand(var Message: TWMSysCommand); begin if Message.CmdType and $FFF0 = SC_MINIMIZE then begin MinimizeToTray; end else inherited; end;
Delphi-Quellcode:
Sieht jemand von euch da einen Fehler? Ich kann beim besten Willen keinen entdecken.
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin if AskForClose and (not MinimizeAtClose) then begin if Application.MessageBox('Programm beenden?', 'Hinweis', MB_YESNO) = IDYes then begin AskForClose := false; MinimizeAtClose := false; CanClose := true; Application.MainForm.Close; end else CanClose := false; end; end; |
Re: Windows beendet Programm nicht
Weil CanClose := false; gesetzt ist auch bei der WM_QueryEndSession Message ?
|
Re: Windows beendet Programm nicht
Nur 'n paar Gedanken...
1. Schießt du dir bei <HIER> nicht selbst in den Hintern? Du bist doch schon im Close weil CloseQuery aufgerufen wurde. Zitat:
3. Wenn das nichts hilft würde ich mir in WndProc einen Logger packen, der alle Fenstermeldungen mitschreibt. Dann weißt du mal, was so ein Windows Shutdown überhaupt an Meldungen verursacht. Ansonsten wüsste ich nicht, was den Shutdown aufhalten sollte. Was klappt denn nicht, kommt die Rückfragebox? |
Re: Windows beendet Programm nicht
Zitat:
Zitat:
Zitat:
Dann kann ich ja nicht mehr entsprechend reagieren. Zitat:
Zitat:
Ich habe auch testweise ShowMessage in der WMQUERYENDSESSION Prozedur und im OnCloseQuery aufgerufen, doch sehe ich nie einen Dialog. Evtl. tritt das Ereignis gar nicht erst ein. :gruebel: |
Re: Windows beendet Programm nicht
Zitat:
Was haste denn für ein OS ? |
Re: Windows beendet Programm nicht
Zitat:
Also mein Msg-Log zeigt, dass folgende Messages aufgerufen werden (lParam): Zitat:
Zitat:
|
Re: Windows beendet Programm nicht
![]()
Delphi-Quellcode:
private
procedure WMQueryEndSession (var Msg : TWMQueryEndSession); message WM_QueryEndSession; end; Implementation procedure TForm1.WMQueryEndSession (var Msg : TWMQueryEndSession); begin if MessageDlg('Close Windows now/ Windows beenden?', mtConfirmation, [mbYes,mbNo], 0) = mrNo then Msg.Result := 0 else Msg.Result := 1; end; |
Re: Windows beendet Programm nicht
Das habe ich auch schon versucht, danke, nur ändert das auch nichts. Ich verstehe das absolut nicht.
|
Re: Windows beendet Programm nicht
Die Flags (MinimizeAtClose u. AskForClose) müsstest du eigentlich vor dem inherited setzen, da FormCloseQuery nämlich in Delphis eigenen QueryEndSession-Handler aufgerufen wird (und dieser Handler selbst wieder durch das inherited).
|
Re: Windows beendet Programm nicht
Zitat:
Normalerweise bekommen nämlich alle Formen einer Application eine solche Message zugeschickt und nur dann, wenn alle sie mit True beantwortet haben, deaktiviert die Application anschließend auch. Beantwortet nur eine Form diese Message mit false, bekommen die weiteren Formen keine QueryEndSession-Message mehr und die Application bleibt am Leben. (hoffe ich erzähle hier keinen Bockmist, glaube es aber nicht :-)) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz