Hi,
Hab schreibe grad ein kleines Programm und es soll erst beendet werden wenn der Computer herunterfährt, bzw. man sich abmeldet. Also dachte ich mir, ich reagiere einfach auf WM_ENDSESSION/WM_QUERYENDSESSION. Dafür brauche ich ein Fenster -> AllocateHwnd.
Das Problem ist, dass beim der Hauptthread meiner Anwendung scheinbar abkackt sobald GetMessage aufgerufen wird, denn wenn ich debugge, komme ich weder in die while-Schleife rein, noch dahinter. Das einzige, was nach dem Aufruf von GetMessage noch lebt ist mein vorher erstellter Thread:
Delphi-Quellcode:
program FasHQ;
uses
Windows,
Messages,
CommCtrl,
SysUtils,
Classes;
type
TDummyWin = class
class procedure WndProc(var Message: TMessage);
end;
var SafeThread: THandle;
SafeThreadTerminated: Boolean = false;
Quit: Boolean = false;
wnd: hwnd;
{ TDummyWin }
// *) Diese Zeilen werden nie erreicht
class procedure TDummyWin.WndProc(var Message: TMessage);
begin
case Message.Msg of // * ff
WM_QUERYENDSESSION: begin
Quit := true;
SafeThreadTerminated := true;
Message.Result := Integer(true);
end;
else
Message.Result := DefWindowProc(wnd,Message.Msg,Message.wParam,Message.lParam);
end;
end;
procedure ThreadProc;
begin
while not SafeThreadTerminated do
begin
// ein paar Aktionen
sleep(1);
end;
end;
var id: Cardinal;
msg: TMsg;
begin
SafeThread := BeginThread(nil,0,@ThreadProc,nil,0,id);
wnd := AllocateHwnd(TDummyWin.WndProc);
while (GetMessage(msg,0,0,0)) and (not Quit) do // Ab hier kackt der MainThread ab
begin
TranslateMessage(msg); // *
DispatchMessage(msg); // *
end;
TerminateThread(SafeThread,0); // *
DestroyWindow(wnd); // *
end.
Mache ich denn irgendwas falsch? o.O
Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."