und abschließend auch nochmal die ganz nette Lösung:
Delphi-Quellcode:
library HookDll;
uses
Windows,
Messages,
SysUtils;
const
WM_SpecialEvent = WM_User + 1678;
type
THookRec = record
hOldHook: HHOOK;
hOwnProg: HWND;
hZielApp: HWND;
end;
var
hMap: DWord;
buf: ^THookRec;
function GetMsgProc(nCode: Integer; wp: wParam; lp: lParam): LResult; stdcall;
procedure KillMsgAndPostInfo;
const Closing = 1234;
blocked = 5678;
begin
PMsg(lp)^.message := WM_Null;
// plus einem Info-Post an den Hook-Erzeuger
PostMessage(buf^.hOwnProg, WM_SpecialEvent, Closing, blocked);
end;
var ARect : TRect;
begin
if (nCode >= HC_ACTION) then
case PMsg(lp)^.message of
WM_Close : // beim Closen übers Main-Menue
KillMsgAndPostInfo;
WM_SysCommand : // beim Closen übers Window-Menue
if PMsg(lp)^.wParam = SC_CLOSE then
KillMsgAndPostInfo;
WM_NCLButtonDown : begin // beim Closen über die X-Button in der Title-Bar
GetWindowRect(buf^.hZielApp,ARect);
ARect.Right := ARect.Right -4;
ARect.Left := ARect.Right -18;
ARect.Top := ARect.Top +3;
ARect.Bottom := ARect.Top +19;
with PMsg(lp)^.pt, ARect do
if (X >= Left) and (X <= Right)
and (Y >= Top) and (Y <= Bottom) then
KillMsgAndPostInfo;
end;
end; { of case }
Result := CallNextHookEx(buf^.hOldHook, nCode, wp, lp);
end;
.
.
edit: Nachträglicher Einbau des Abfangens auch noch einer WM_Close-Message.
...was z.B. dann nötig ist (nicht aber bei calc.exe), wenn man diesen Hook auch auf Applications anwenden möchte, welche auch zusätzlich noch eine Programmbeende-Möglichkeit übers Mainmenue besitzten (Mainmenue --> Datei --> Beenden).
edit: nur noch Mini-Kosmetik