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
Antwort Antwort
Seite 1 von 2  1 2      
TStringlist

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

Schließen eines fremden Programms verhindern

  Alt 14. Feb 2005, 14:02
Hallo,

wie schon in der Überschrift angedeutet, möchte ich in meinem Programm verhindern, dass ein anderes fremdes Programm beendet werden kann. Ein Hooken dieses anderen fremden Progs wäre dabei kein Problem. Leider aber scheint ein solches Prog-Beenden (z.B. per X-Button in der Title-Leiste) dort nicht über ein WM_Close abgewickelt zu werden...

Gibt's da vielleicht sonst noch Messages (o. ggf. auch andere Techniken) mittels denen man das bewerkstelligen kann?

Thx im Voraus.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
TopDogg

Registriert seit: 28. Jun 2002
51 Beiträge
 
#2

Re: Schließen eines fremden Programms verhindern

  Alt 14. Feb 2005, 14:10
Spontan fehlt mir nur WM_DESTROY ein.
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#3

Re: Schließen eines fremden Programms verhindern

  Alt 14. Feb 2005, 14:19
Hallo TStringList,

ganz wirst du das nie verhindern können, denn wenn man ein Programm über den Taskmanager abschießt, wird deine Anwendung auch nichts dagegen sagen können. Du kannst höchstens einen "Watchdog" machen, welcher die Anwendung sofort wieder startet sobald sie beendet wurde. Inwieweit das immer möglich ist, bleibt fraglich, denn der Effekt ist nicht der gleiche wie beim Schließen verhindern.

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
TStringlist

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

Re: Schließen eines fremden Programms verhindern

  Alt 14. Feb 2005, 14:30
Thx all.


@TopDogg

WM_Destroy scheint diesbezüglich leider auch nicht ans Prog abgeschickt zu werden.

Wie ich eben feststelle, WM_Quit allerdings schon ...nur klappt's dabei leider irgendwie nicht mit dem Abfangen (... wenn das dann überhaupt die Lösung wäre).

Abzufangen versuche ich das im Message-Hook so:

Delphi-Quellcode:
if PMsg(lp)^.message = WM_Quit then begin
  windows.beep(300,25);
  Result := 0;
  exit;
end;
das gänge doch so, oder?


@alcaeus

So ein Watchdog habe ich tatsächlich schon, nur dachte ich jetzt, es einfach gleich ganz zu verhindern, wäre irgendwie doch noch etwas eleganter. ...Das Verhindern des schließens des Progs über den Taskmanager wäre dabei auch nicht so wichtig. Es soll eher nur verhindert werden, dass das fremde Programm aus Versehen geschlossen wird.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Benutzerbild von Boombuler
Boombuler

Registriert seit: 14. Mär 2003
Ort: Osnabrück
244 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Schließen eines fremden Programms verhindern

  Alt 14. Feb 2005, 15:03
Lasst mich lügen aber ich glaub zu diversen Closehooks gibts hier schon themen genug....

Greetz
Boombuler
"Look at you, Hacker. A pathetic creature of meat and bone, panting and sweating as you run through my corridors. How can you challenge a perfect, immortal machine?"
SwapIt Highscore:
  Mit Zitat antworten Zitat
TStringlist

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

Re: Schließen eines fremden Programms verhindern

  Alt 14. Feb 2005, 15:24
Allgemein zu Hooks schon, aber nicht zu quasi Closehooks. Ansonsten, stell doch mal bitte 2 o. 3 Links davon hier rein. Danke
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Benutzerbild von Boombuler
Boombuler

Registriert seit: 14. Mär 2003
Ort: Osnabrück
244 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Schließen eines fremden Programms verhindern

  Alt 14. Feb 2005, 17:18
Sorry war kein Hook...
aber ich denke mit abfangen folgender Message solltest du erfolg haben:
SendMessage(Handle, WM_SYSCOMMAND, SC_CLOSE, 0); ich hab auch mal n CloseHook geschrieben hab allerdings den QT verlegt! Ich meine aber ich hab eben jene Message abgehookt!

Greetz
Boombuler

[edit]
hab das dingen gerad wieder gefunden!

Delphi-Quellcode:
type
  PTMsg = ^TMsg;

function CloseHookProc(nCode: Integer; wParam: WPARAM; lParam:Integer):
 LRESULT; stdcall;
var aCopy:TCopyDataStruct;
begin
  case nCode < 0 of
    FALSE:
      begin
       if (PTMsg(lparam).message = WM_Close) then
        begin
           //Hier springt der rein wenn ein programm geschlossen wurde
        end;
      end;
  end;
Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
end;
"Look at you, Hacker. A pathetic creature of meat and bone, panting and sweating as you run through my corridors. How can you challenge a perfect, immortal machine?"
SwapIt Highscore:
  Mit Zitat antworten Zitat
TStringlist

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

Re: Schließen eines fremden Programms verhindern

  Alt 14. Feb 2005, 18:23
doch, ja, WM_SysCommand sähe eigentlich ganz gut aus. Habe auch gerade diesbezüglich in der PSDK gelesen, dass diese Message bei einem solchen Ereignis (also einem App-Closen über die X-Button rechts in der Title-Leiste) dann eigentlich auch abgeschickt wird. Aber leider kommt sie in der HookProc irgendwie nicht an (egal mit welchem weiteren wParam-Wert).

Zur allgemeinen Information vielleicht noch: Das gehookte Prog ist hier nur der ganz normale Rechner, wohl immer zu finden per FindWindow mit den Parametern ('Rechner','SciCalc').

Und hier nochmal kurz, welche Messages beim App-Closen in der HookProc auch leider nur vorbeikommen. (WM_LButtonDown habe ich nur zum generellen Test der HookProc mit dazugenommen):

Delphi-Quellcode:
function PROC(nCode: Integer; wp: wParam; lp: lParam): LongInt; stdcall;
var pt : TSmallPoint;
begin
  if (nCode >= HC_ACTION) then
    case PMsg(lp)^.message of
      WM_Close : Beep; <-- gibt's nie
WM_Destroy : Beep; <-- gibt
's nie
      WM_Quit : begin
                  windows.Beep(300,25); <-- kommt, ist aber leider nicht abzufangen...
                  // PMsg(lp)^.message := WM_Null // ...wenigstens so nicht
                  // Result := 0;
                  // exit;
                end;
      WM_SysCommand : windows.beep(1000,25); <-- gibt's nie
WM_LButtonDown : windows.beep(2500,25); <-- kommt bei jedem LButtonDown
end; { of case }

Result := CallNextHookEx(buf^.hMSNHook, nCode, wp, lp);
end;
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
TStringlist

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

Re: Schließen eines fremden Programms verhindern

  Alt 14. Feb 2005, 18:43
Ich glaube einen Lösungs-Ansatz gefunden zu haben.

Wie ich gerade feststellte, geht es nämlich diese besagte X-Button in der Title-Leiste durch ein Abfangen der WM_NCLButtonDown-Message zu blockieren. Alles was ich also jetzt noch zu tun habe, ist, die absolute X/Y-Position des Rechners zu bestimmen, die relative Position der besagten X-Button darauf und ob die Mouse-Position sich dann gerade darüber befindet. In dem Fall schlucke ich diese Message einfach (was ja funktioniert) und die Sache ist geritzt...

Thx all nochmal...


[edit] ...und das Closen der Fremd-App über das Menue welches über die rechte Maustaste aus der App-Button in der Task-Bar aufpopt, das ist dann tatsächlich über das abfangen der WM_SysCommand-Message blockierbar.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
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
Antwort Antwort
Seite 1 von 2  1 2      


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 16:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz