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.