AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Nachricht, wenn irgendein Programm gestartet wird ?
Thema durchsuchen
Ansicht
Themen-Optionen

Nachricht, wenn irgendein Programm gestartet wird ?

Ein Thema von Dannyboy · begonnen am 30. Aug 2003 · letzter Beitrag vom 3. Sep 2003
Antwort Antwort
Seite 1 von 2  1 2      
Dannyboy

Registriert seit: 4. Aug 2003
Ort: Delphi-Heaven
418 Beiträge
 
Delphi 7 Personal
 
#1

Nachricht, wenn irgendein Programm gestartet wird ?

  Alt 30. Aug 2003, 16:57
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Nachricht, wenn irgendein Programm gestartet wird ?

  Alt 30. Aug 2003, 18:34
Mach einen Snapshot und vergleiche immer mit dem vorherigen. Code dazu findets du in der WinAPI Sparte der Code-Lib.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#3

Re: Nachricht, wenn irgendein Programm gestartet wird ?

  Alt 31. Aug 2003, 13:09
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.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#4

Re: Nachricht, wenn irgendein Programm gestartet wird ?

  Alt 31. Aug 2003, 13:12
IShellExecuteHook der COM Schnittstelle des Explorers. Man findet im DEMO Ordner einige Sourcen dazu.

Gruß Hagen
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#5

Re: Nachricht, wenn irgendein Programm gestartet wird ?

  Alt 31. Aug 2003, 14:25
*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 :-/
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Nachricht, wenn irgendein Programm gestartet wird ?

  Alt 31. Aug 2003, 14:28
Moin Hagen,

welchen Demo Ordner meinst Du?
In meinem von D5 ist nichts dazu zu finden.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von CrashMan
CrashMan

Registriert seit: 1. Aug 2003
Ort: //127.0.0.1/
65 Beiträge
 
Delphi 6 Personal
 
#7

Re: Nachricht, wenn irgendein Programm gestartet wird ?

  Alt 31. Aug 2003, 16:11
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
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#8

Re: Nachricht, wenn irgendein Programm gestartet wird ?

  Alt 31. Aug 2003, 18:17
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Nachricht, wenn irgendein Programm gestartet wird ?

  Alt 31. Aug 2003, 18:56
Moin Hagen,

schade, die Demo scheint's bei D5 noch nicht zu geben.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#10

Re: Nachricht, wenn irgendein Programm gestartet wird ?

  Alt 1. Sep 2003, 13:01
\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
  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 18:21 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