![]() |
Benachrichtigung wenn Prozess gestartet wurde
Hallo,
ich grübele jetzt seit einiger Zeit daran, wie mein Programm benachrichtigt werden kann, wenn ein bestimmter Prozess (mit Fenster) gestartet wurde. Dabei sind mir bisher folgende Lösungen unter gekommen: Überwachung nach EXE:
Überwachung nach Fenster:
Das wären so die Ideen, die ich habe. Fällt euch noch etwas anderes ein? Danke und schönes Wochenende! |
AW: Benachrichtigung wenn Prozess gestartet wurde
Du könntest einen Image Hijack versuchen.
Wenn irgendjemand den Prozess starten möchte wird in Wirklichkeit der Prozess gestartet, den du angegeben hast. ![]() |
AW: Benachrichtigung wenn Prozess gestartet wurde
Zitat:
MfG Dalai |
AW: Benachrichtigung wenn Prozess gestartet wurde
Zitat:
Zitat:
|
AW: Benachrichtigung wenn Prozess gestartet wurde
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
Die Funktion stellt dabei erstmal eine Liste der aktiven Prozesse zusammen und sammelt Infos über sie (PID, Name, Affinität, Priorität). Diese Liste wird dann im Anschluss verarbeitet (also nochmals durchlaufen) und mit der im Programm vordefinierten Liste der Prozesse verglichen und angewendet (Zugehörigkeit und Priorität zugewiesen).
var
hProcSnapshot : THandle; ProcInfo : TProcessEntry32; ProzessHandle : HWND; dummy : DWORD; begin hProcSnapshot:= CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); if hProcSnapshot = INVALID_HANDLE_VALUE then Exit; ProcInfo.dwSize:= SizeOf(TProcessEntry32); if not Process32First(hProcSnapshot, ProcInfo) then Exit; repeat // Filter für bestimmte Prozesse. Wenn Filter leer, dann alle Prozesse if (LowerCase(ProcInfo.szExeFile) = proz) OR (proz = '') then begin if (LowerCase(ProcInfo.szExeFile) <> 'system') then begin ProzessHandle:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, ProcInfo.th32ProcessID); if (ProzessHandle <> 0) then begin // hier Hauptaufgabe end; CloseHandle(ProzessHandle); end; end; until (not Process32Next(hProcSnapshot, ProcInfo)); CloseHandle(hProcSnapshot); end; Beim Durchschauen des Codes ist mir aufgefallen, dass in diesem Teil überhaupt keine Fehlerbehandlung und auch keine Überlaufprüfung vorhanden ist, eieiei. Naja, ich wollte das Programm eh komplett überarbeiten :mrgreen: (aber erst, wenn ich Zeit habe). MfG Dalai |
AW: Benachrichtigung wenn Prozess gestartet wurde
So ähnlich sieht das bei mir auch aus:
Delphi-Quellcode:
Zum Thema WMI "EventWatching", "Win32_ProcessStartTrace": Rein Interesse halber: Hat damit schon mal jemand gearbeitet und hat Tipps/Code-Schnipsel/Erfahrungen, die er teilen kann? :-)
function IsProcessRunning(const FileName: string): Cardinal;
var hSnapshot : Cardinal; EntryParentProc: TProcessEntry32; begin Result := 0; hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if hSnapshot = INVALID_HANDLE_VALUE then exit; try EntryParentProc.dwSize := SizeOf(EntryParentProc); if Process32First(hSnapshot, EntryParentProc) then repeat if FileName = EntryParentProc.szExeFile then begin Result := EntryParentProc.th32ProcessID; break; end; until not Process32Next(hSnapshot, EntryParentProc); finally CloseHandle(hSnapshot); end; end; |
AW: Benachrichtigung wenn Prozess gestartet wurde
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab noch nie damit gearbeitet, habe aber durch stöbern in der C++ Docu den Code zusammen geschusstert. Du musst nur noch es nur noch in nem Thread auslagern, da er die Anwendung so auf eisleget und du hast deine Abfrage. Im Anhang die Interfaces Datei, die ich per Delphi erstellen gelassen hab, nur die die meisten müsste man umändern, damit man die Errorcodes zurückbekommt, aber beim Debuggen übernihmt das die VCL meistens von selbst. Die Funktionen für diesen Ablauf habe ich bereits umgeändert.
Die Eigenschaften musst du im String suchen. Es gibt auch eine Möglichkeit, sie über die Interfaces abzurufen, aber dies führte bei mir nur zu Fehlern. Kannst es ja mal versuchen, wenn du durchblickst xD Hier der Code:
Delphi-Quellcode:
var hr : HRESULT;
pLoc : ISWbemLocator; pSvc : ISWbemServices; pObj,pNewInsta : ISWbemObject; pEvent : ISWbemEventSource; Str : WideString; begin //Haupt-Interface hr := CoCreateInstance(CLASS_SWbemLocator, nil, CLSCTX_INPROC_SERVER, IID_ISWbemLocator, pLoc); if FAILED(hr) then begin ShowMessage('Fehler'); Exit end; //Basiert anscheinend auf IP/Domain, ob man da vielleicht Server-Prozzese abrufen kann? Glaub ich eher nicht. hr := pLoc.ConnectServer('localhost', '', '', '', '', 0, '',nil, pSvc); if FAILED(hr) then begin pLoc._Release; ShowMessage('Fehler'); Exit; end; ShowMessage('Connected to WMI'); //Ab hier hast du Zugriff. //Der Erste Parameter ist die Abfrage, dies basiert sehr auf SQL, was auch in der Beschreibung von "WQL", wie es sich nennt, steht. //Du kannst sehr vieles abrufen, aber damit fragst du ab, wenn ein Prozzes gestartet wurde. //Bei mir hat es mit dem Windows Editor geklappt, und 0 % CPU Auslastung beim Warten xD hr := pSvc.ExecNotificationQuery('SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE targetInstance ISA "Win32_Process"', 'WQL', $00000020 or $00000010, nil, pEvent); if FAILED(hr) then begin pLoc._Release; pSvc._Release; ShowMessage('Fehler bei Query'); Exit; end; //Hier die Schleife, nach NextEvent, wartet das Programm auf einen Prozzes start. while True do hr := pEvent.NextEvent(wbemTimeoutInfinite,pNewInsta); //pNewInsta ist nun der neue Prozzes, womit du nun alle Infos abfragen kannst if FAILED(hr) then begin pLoc._Release; pSvc._Release; pEvent._Release; ShowMessage('Fehler bei Instance'); Exit; end; //Lass dir es mal in nem Memo ausgeben, da siehste, das sogut //wie alles in einem Klartext steht, in einer Art C++ Class Format. //Die ist aber sehr leicht zuverstehen finde ich. //Sollte für deine Zwecke reichen Str := pNewInsta.GetObjectText_(0); //Ist am einfachsten. //...bis hier hin. |
AW: Benachrichtigung wenn Prozess gestartet wurde
Doch, das geht auch auf anderen PCs, wenn du dort die notwendigen Zugriffsrechte hast.
Deine Warteschleife hat allerdings keinen Abbruch, deshalb wird das so kaum funktionieren. Fehlt da vielleicht ein begin..end? ;-) Ich würde hier aber auch eher Events benutzen. Stichwort ExecNotificationQueryAsync. Bei Bedarf kann ich dazu auch ein Beispiel basteln. |
AW: Benachrichtigung wenn Prozess gestartet wurde
Vielen Dank, NickelM! Das ist, glaube ich, der erste Delphi-Code-Schnipsel, den ich - so ausführlich kommentiert - dazu gesehen habe :-)
Zitat:
|
AW: Benachrichtigung wenn Prozess gestartet wurde
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, hab ich dann mal gemacht. Hat doch ein paar Minuten länger gedauert als ich dachte.
Direkt lauffähig ist das Beispiel ab Delphi 2007 inklusive XE2. Bei Delphi 2006 muss Application.MainFormOnTaskbar in der Projektdatei entfernt werden, die Uraltversionen vorher habe ich nicht getestet, aber da könnte es reichen die Quelltextdateien als Ansi zu speichern. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:24 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