Einzelnen Beitrag anzeigen

TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Schließen eines fremden Programms verhindern

  Alt 14. Feb 2005, 22:18
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
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat