AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Schließen eines fremden Programms verhindern
Thema durchsuchen
Ansicht
Themen-Optionen

Schließen eines fremden Programms verhindern

Ein Thema von TStringlist · begonnen am 14. Feb 2005 · letzter Beitrag vom 17. Feb 2005
 
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, 21: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz