AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Message korrekt behandeln

Ein Thema von KodeZwerg · begonnen am 21. Mai 2018 · letzter Beitrag vom 19. Sep 2022
 
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

Message korrekt behandeln

  Alt 21. Mai 2018, 10:34
Hallo Gemeinde, ich teste mich weiter in non-Vcl vor, nun erlerne ich den Umgang mit Messages.
Um das alles besser zu Verstehen habe ich mir ein Beispiel erstellt was nichts weiter tut als mir eine ShowMessage zu zeigen.

Warum beendet SendMessage(Wnd, WM_QUIT, 0, 0); nicht in das Programm? ShowMessage kommt und danach ist App in Endlos-Schleife.
Warum kann ich PostMessage(Wnd, WM_QUIT, 0, 0); nicht in meinem Hook abfangen? ShowMessage kommt nicht, App ist beendet.

Delphi-Quellcode:
program Projekt1;

uses
  SysUtils, Windows, Messages, Classes, Dialogs;

type TMyApp = Class
       FWnd: HWND;
       Constructor Create;
       Destructor Destroy; override;
       Procedure WndProc(var Msg: TMessage);
     end;

{ TMyApp }
Constructor TMyApp.Create;
begin
  FWnd := AllocateHWnd(WndProc); //unsichtbares Fenster erzeugen
end;

Destructor TMyApp.Destroy;
begin
  DeallocateHWnd(FWnd);
  inherited;
end;

procedure TMyApp.WndProc(var Msg: TMessage);
begin
  //hier kommen die Messages an (SendMessage direkt, PostMessage über Funktion DispatchMessage)
  case Msg.Msg of
    WM_USER: ShowMessage('catched WM_USER Msg!');
    WM_QUIT: ShowMessage('catched WM_QUIT Msg!');
  end; // case
  Dispatch(Msg);
end;

function ThreadProc(Wnd :HWND): Integer;
begin
  Sleep(1000);
  PostMessage(Wnd, WM_USER, 0, 0);
  SendMessage(Wnd, WM_USER, 0, 0);
  Sleep(1000);
// SendMessage(Wnd, WM_QUIT, 0, 0); //Programm beenden
  PostMessage(Wnd, WM_QUIT, 0, 0); //Programm beenden
end;

procedure Start;
var
  Msg: TMsg;
  App: TMyApp;
  Id: Cardinal;
begin
  App := TMyapp.Create;
  CloseHandle(BeginThread(nil, 0, @ThreadProc, Pointer(App.FWnd), 0, Id));
  while GetMessage(Msg, 0, 0, 0) do //auf Message in der Queue warten
  begin
    //Message an Fenster verteilen
    DispatchMessage(Msg);
  end;
  App.Free;
end;


begin
  Start;
end.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:59 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