Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 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