![]() |
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 |
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.
|
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. |
Re: Nachricht, wenn irgendein Programm gestartet wird ?
IShellExecuteHook der COM Schnittstelle des Explorers. Man findet im DEMO Ordner einige Sourcen dazu.
Gruß Hagen |
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:
... 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 :-/
Execute Called when ShellExecute or ShellExecuteEx is called for an object that is registered.
|
Re: Nachricht, wenn irgendein Programm gestartet wird ?
Moin Hagen,
welchen Demo Ordner meinst Du? In meinem von D5 ist nichts dazu zu finden. |
Re: Nachricht, wenn irgendein Programm gestartet wird ?
also:
Ich hab hier einen Source der per Buttonklick alle Prozesse auflistet.
Delphi-Quellcode:
Das kannste mit 2 Listboxen machen.
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; in die erste einlesen warten in 2. einlesen Vergleichen 2->1 2 neuschreiben (prozesse wieder abfrabgen) vergleichen 2->1 usw. CrashMan |
Re: Nachricht, wenn irgendein Programm gestartet wird ?
Zitat:
Demos\ShellExt\ Ordner. Gruß Hagen |
Re: Nachricht, wenn irgendein Programm gestartet wird ?
Moin Hagen,
schade, die Demo scheint's bei D5 noch nicht zu geben. :? |
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 02:07 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