Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Messages bei nonVCL? (https://www.delphipraxis.net/115411-messages-bei-nonvcl.html)

blackdrake 11. Jun 2008 18:06


Messages bei nonVCL?
 
Hallo.

Ich möchte folgenden Code in nonVCL (also nur noch DPR, keine DFMs mehr) portieren:

Delphi-Quellcode:
type
  TMainForm = class(TForm)
  private
    procedure WMEndSession(var Msg : TWMEndSession); message WM_ENDSESSION;
  end;
Ich habe es bereits mit Application.OnTerminate probiert, aber es hat nicht funktioniert. Sobald ich nicht mehr mit Forms arbeite (TMainForm.MeineProzedur wird zu MeineProzedur), funktioniert es nicht mehr. Meldung kann ich nochmal nachreichen.

Dieser Zusatz "message WM_ENDSESSION" funktioniert auch nur innerhalb eines Forms.

Muss ich nun mit einer Schleife arbeiten, die mittels PeekMessage das Shutdown-Signal abfängt? Dann müsste ich aber extra dafür einen Thread anlegen, weil der Programmfluss sich ja primär mit einer anderen Aufgabe beschäftigt. :?

Gruß
blackdrake

Luckie 11. Jun 2008 18:08

Re: Messages bei nonVCL?
 
Nun ja, du brauchst eine Nachrichtenschleife und eine Fensterprozedur und damit verbunden eben ein Fenster, da diese Nachricht an toplevel Fenster verschickt wird.

blackdrake 11. Jun 2008 18:10

Re: Messages bei nonVCL?
 
Nachrichtenschleife, ja. Aber die Anwendung arbeitet ohne Fenster im Hintergrund. Hatte ich vergessen dazu zu sagen. Ist also alles unsichtbar, deswegen will ich keine Forms.

Ist eine Nachrichtenschleife in einer nonVCL unabdingbar? Muss diese in einen Thread, damit das Programm primär was anderes arbeiten kann?

Luckie 11. Jun 2008 18:24

Re: Messages bei nonVCL?
 
Kommt drauf an wie du nonVCL definierst. An was ist die Nachrichtenschleie gebunden, wenn nicht an ein Fenster?

blackdrake 11. Jun 2008 18:30

Re: Messages bei nonVCL?
 
Wenn ich keine sichtbaren Elemente habe, gibt's auch kein Fenster und dann habe ich quasi nur Pascal. Das ist absolutes nonVCL :wink:

Delphi-Quellcode:
program xyz;

uses
  SysUtils, ...;

procedure HerunterfahrenEvent();
begin
  // Aktionen beim Herunterfahren
end;

begin
  // ToDo: Hier Arbeit machen

  // Problem: HerunterfahrenEvent() beachten;

  // Ende des Programms
end;
Für Nachrichtenschleife könnte ich einen Thread aufmachen. An ein Fenster kann ich es ja nicht binden. Aber ist das überhaupt professionell, extra einen Thread aufzumachen, der lediglich die Aufgabe hat, was zu machen, sobald das Shutdown-Signal kommt? Oder gibt's was alternatives?

DeddyH 11. Jun 2008 18:34

Re: Messages bei nonVCL?
 
Du könntest ein Fenster erzeugen, dieses aber nicht anzeigen.

Apollonius 11. Jun 2008 19:34

Re: Messages bei nonVCL?
 
Windows bietet eine Möglichkeit, Konsolen-Handler zu registrieren, mit denen man u.A. strg-c, Beenden des Konsolenfensters und Herunterfahren abfangen kann. MSDN-Library durchsuchenSetConsoleCtrlHandle Laut MSDN sollte das auch ohne Konsole funktionieren.

himitsu 12. Jun 2008 10:48

Re: Messages bei nonVCL?
 
ansonten hilft auch sich ein unsichtbares Top-Level-Fenster zu erstellen,
oder besser gleich ein MessageOnly-Fenster.

Olli 15. Jun 2008 23:29

Re: Messages bei nonVCL?
 
Prinzipiell werden Nachrichten ja an Threads verschickt und auch wenn ein Thread mehrere Fenster hat, hat der Thread nur eine Nachrichtenschleife. Folglich ist es durchaus möglich eine Nachrichtenschleife in einem Thread einzurichten und per PostThreadMessage() an den Thread zu richten. Dabei sollte klar sein, daß der Unterschied zwischen Post* und Send* hier auch gilt, es aber keine Send*-Variante gibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz