Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Nachricht, wenn irgendein Programm gestartet wird ? (https://www.delphipraxis.net/8198-nachricht-wenn-irgendein-programm-gestartet-wird.html)

Dannyboy 30. Aug 2003 15:57


Nachricht, wenn irgendein Programm gestartet wird ?
 
Hallo, ich würde gern eine Applikation schreiben, die mir für jedes
eröffnete Programm eine Nachricht (z.B. per MessageDlg) auf dem Bildschirm ausgibt.

Beispiel:

Ich öffne ein Word-Dokument (z.B. per Doppelklick) und nun soll auf
dem Bildschirm die Nachricht "Word.exe wurde gestartet" erscheinen.

Meine Frage lautet demnach: Wie kommen ich an die Information heran,
wann welches externe Programm gestartet worden ist ???

Mit freundlichen Grüßen
DANNY

Luckie 30. Aug 2003 17:34

Re: Nachricht, wenn irgendein Programm gestartet wird ?
 
Mach einen Snapshot und vergleiche immer mit dem vorherigen. Code dazu findets du in der WinAPI Sparte der Code-Lib.

Assarbad 31. Aug 2003 12:09

Re: Nachricht, wenn irgendein Programm gestartet wird ?
 
Dazu gibt es seit Windows 2000 eine undokumentierte Native API im Kernel-Mode. Will heißen du müßtest tatsächlich einen Treiber schreiben und mit diesem kommunizieren. Wir hatten das Thema vor ein oder zwei Wochen, also bemüh' bitte einmal die Suchfunktion.

Achso, was Luckie übrigens meint, ist ein Toolhelp-Snapshot und der ist von daher unsicher, weil beispielsweise zwischen 2 Snapshots (nimmst du eine zu geringe Zeitspanne wird es lahm) eine weitere Instanz von Winword.exe starten könnte und die alte beendet wird. Dadurch bemerkst du im schlimmsten Falle nicht die Änderung. Es hieße also auch noch PIDs vergleichen ... und eigentlich (auf Windows NT/2000 ...) auch die Startzeit des Prozesses. Da kommst du mit der ToolHelp-API aber nciht dran.

negaH 31. Aug 2003 12:12

Re: Nachricht, wenn irgendein Programm gestartet wird ?
 
IShellExecuteHook der COM Schnittstelle des Explorers. Man findet im DEMO Ordner einige Sourcen dazu.

Gruß Hagen

Assarbad 31. Aug 2003 13:25

Re: Nachricht, wenn irgendein Programm gestartet wird ?
 
*g* ... sowas mußte kommen. Aber unerwähnt soll nicht bleiben, daß eben auch nur Prozesse die vom Explorer u.a. per ShellExecute/Ex gestartet werden, damit überwacht werden können ;)

Code:
Execute Called when ShellExecute or ShellExecuteEx is called for an object that is registered.
... da kann auch nicht im Sinne des Erfinders sein. Zumal viele Leute lieber CreateProcess statt ShellExecuteEx nehmen um auf das Ende eines Childprozesses zu warten :-/

Christian Seehase 31. Aug 2003 13:28

Re: Nachricht, wenn irgendein Programm gestartet wird ?
 
Moin Hagen,

welchen Demo Ordner meinst Du?
In meinem von D5 ist nichts dazu zu finden.

CrashMan 31. Aug 2003 15:11

Re: Nachricht, wenn irgendein Programm gestartet wird ?
 
also:
Ich hab hier einen Source der per Buttonklick alle Prozesse auflistet.

Delphi-Quellcode:
function GetProcessName(PID: DWORD): String;
var
  hProcess: cardinal;
  buffer : array [0..MAX_PATH-1] of Char;
begin
  result := '';
  Zeromemory(@buffer, sizeof(buffer));
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE,
    PID);
  if hProcess <> 0 then
  begin
    GetModulebaseName(hProcess, 0, buffer, sizeof(buffer));
    result := String(buffer);
    CloseHandle(hProcess);
  end
end;


procedure TForm1.Button1Click(Sender: TObject);

var
  pdwResult : PDWORD; // für den Buffer
  pdwWork   : PDWORD; // um dem Buffer verarbeiten zu können
  dwCountIn : DWORD; // Grösse des Buffers in Byte
  dwCountOut : DWORD; // Zurückgelieferte Anzahl Byte
  i         : integer;
begin
  dwCountOut := 0;   // Sicherheitshalber initialisieren, muss nicht sein
  dwCountIn := 1024; // Willkürlich gewählt, genügt für 256 Prozesse
  pdwResult := AllocMem(dwCountIn);
  try
    if not EnumProcesses(pdwResult,dwCountIn,dwCountOut) then begin
      ShowMessage(SysErrorMessage(GetLastError));
    end else begin
      pdwWork := pdwResult; // zur Verarbeitung übergeben, damit FreeMem funktioniert
      Edit1.Text := IntToStr(dwCountOut shr 2);
      for i := 1 to (dwCountOut shr 2) do begin // shr 2 = / 4, da 4 Byte je DWORD
        // Prozess Id ausgeben
        //ShowMessage('ProzessId# '+IntToStr(i)+': '+IntToStr(pdwWork^));
        Memo1.Lines.Add(GetProcessName(pdwWork^));
        // auf nächste addressieren (inc erhöht automatisch um 4, da es ein typisierter Pointer ist
        inc(pdwWork);
      end;
    end;
  finally
    FreeMem(pdwResult,dwCountIn);
  end;
end;
Das kannste mit 2 Listboxen machen.
in die erste einlesen warten in 2. einlesen
Vergleichen
2->1
2 neuschreiben (prozesse wieder abfrabgen)
vergleichen
2->1
usw.

CrashMan

negaH 31. Aug 2003 17:17

Re: Nachricht, wenn irgendein Programm gestartet wird ?
 
Zitat:

*g* ... sowas mußte kommen. Aber unerwähnt soll nicht bleiben, daß eben auch nur Prozesse die vom Explorer u.a. per ShellExecute/Ex gestartet werden, damit überwacht werden können
Ja Asche auf mein Haupt, aber betrachtet man den Aufwand, und möchte man speziell nur auf das Starten das durch einen Anwender im Explorer ausgelösst wird reagieren, dann ist es doch praktisch.


Demos\ShellExt\ Ordner.

Gruß Hagen

Christian Seehase 31. Aug 2003 17:56

Re: Nachricht, wenn irgendein Programm gestartet wird ?
 
Moin Hagen,

schade, die Demo scheint's bei D5 noch nicht zu geben. :?

negaH 1. Sep 2003 12:01

Re: Nachricht, wenn irgendein Programm gestartet wird ?
 
\Demos\ActiveX\ShellEx\CopyHk.pas
In meinen Installationen von D3,D4,D5,D6,D7 vorhanden.

Nur in D1 gibt es sie nicht.

ICopyHook muß nur durch IShellExecuteHook ersetzt werden. Zusäztlich dazu muß dann die DLL aber anders in der Registry registriert werden.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 Uhr.
Seite 1 von 2  1 2      

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