Autor Beitrag
Localhost
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 17.01.11 18:20 
Hallo,

ich erzeuge eine Anwendung ohne Formulare, also Konsole ohne "{$APPTYPE CONSOLE}".
Es läuft eine Schleife mit sleep. habe es nicht anders hinbekommen, Timer werden irgendwie nicht gestartet, da das Programm ja nach dem Aufruf "z.b. TimeSetEvent" ja sofort beendet wird.
Aufjedenfall muss ich ja irgendwie mitbekommen, dass Windows beendet wird.
Aber auf WindowsMessages kann ich auch nicht reagieren?
Hier meckert er z.b., dass er die Anweisung "Message" nicht kennt:
"procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QueryEndSession;"

...ich frage mich, warum ich nirgends eine Lösung hierfür finde. Ich kann doch nicht der einzige sein. Zumindest ein Anderer hatte das gleiche Problem, ihm wurde aber geraten einfach das Formular zu verstecken *g*.


Moderiert von user profile iconMartok: Topic aus Sonstiges (Delphi) verschoben am Mo 17.01.2011 um 19:27
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 17.01.11 20:14 
Ohne Formular hast du kein Fenster, an das Windows Messages schicken könnte (auch keine vom Timer) und keine Botschaftsbehandlungsschleife.

Du musst also zuerst ein Fensterhandle erzeugen und dann für dieses Handle Nachrichten abholen und bearbeiten.

Alternativ kannst du wohl auch per Callback beim Schließen der Konsole benachrichtigt werden. Aber da müsste ich kurz schauen wie das ging. Nee, habs schon:
msdn.microsoft.com/e...682066(v=vs.85).aspx
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 18.01.11 00:13 
Moin!

Noch ein (Detail-)Haken: Windows schickt nur an sog. "Top-Level Windows" (damit meinen die wohl GUI-Fenster) die Message WM_QUERYENDSESSION und WM_ENDSESSION. Wenn du also "nur" eine MessageQueue allozierst, wirst du diese Nachricht auch nie erhalten. :idea: Details dazu im MSDN.

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 18.01.11 00:29 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
sog. "Top-Level Windows" (damit meinen die wohl GUI-Fenster)
Das sind Fenster, bei denen WS_CHILD nicht gesetzt ist. Sichtbar muss es aber AFAIK nicht notwendigerweise sein. Dann würde wohl auch manches nicht funktionieren.
Localhost Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 19.01.11 13:33 
hmm, ein Konsolenfenster habe ich ja nicht.

ansonsten habe ich jetzt probiert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
  Tform1 = class(TForm)
    procedure GetMessages(var msg: Tmessage);
    procedure ResponseMessage1(var Message: TMessage); message WM_QUERYENDSESSION;
    procedure ResponseMessage2(var Message: TMessage); message WM_ENDSESSION;
  end;


procedure Tform1.GetMessages(var msg: Tmessage);
begin
  if (msg.msg = WM_ENDSESSION) or (msg.msg = WM_QUERYENDSESSION) then
    beenden_ := true;
end;

procedure TForm1.ResponseMessage1(var Message: TMessage);
begin
  beenden_ := true;
end;


TestHandle := AllocateHWnd( Form1.GetMessages);


ich vermute mal, es funktioniert nicht da es ja kein echtes Formular gibt? ich nutze TForm ja nur, damit ich eine Methode habe (Compiler nicht meckert).