Entwickler-Ecke

Windows API - Fremder Programmstart melden


LittleBen - Sa 14.08.10 00:11
Titel: Fremder Programmstart melden
Hallo zusammen,
Zuerst einmal:
- Ich bin neu hier im Forum und hoffe, dass mein Thema hier richtig ist
- Ja, ich habe die Suchfunktion benutzt, aber nichts passendes gefunden 8)
- und auch gegoogeld habe ich :wink:

Jetzt zu meinem Thema:

Ich möchte eine Meldung erhalten, sobald ein fremdes Programm ausgeführt wird. Am besten dann noch den Titel des Handles.
Nur wie stell ich das nun an?
Habe schon viel versucht mit der Function ActiveCaption. Aber diese muss ich ja in einen Timer oder in ApplicationMessage schreiben. Doch dann gibt es mir die Caption von dem aktuellen Handle ziemlich oft aus! Desshalb will ich, dass es mir die Caption vom aktuellen Handle nur beim Start gibt.

Danke schon mal im Voraus!

Grüße,
Benny


Xentar - Sa 14.08.10 00:17

Dann merk dir halt mit nem Flag, dass du die Meldung "Programm wurde gestartet" schon ausgegeben hast.

Wie sieht dein Code aus?


ALF - Sa 14.08.10 10:34

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Dann merk dir halt mit nem Flag, dass du die Meldung "Programm wurde gestartet" schon ausgegeben hast.
Ich glaube er meint nicht sein Programm, sondern

user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
Ich möchte eine Meldung erhalten, sobald ein fremdes Programm ausgeführt wird. Am besten dann noch den Titel des Handles.

Suche mal nach ProzessHandle [http://www.devblog.de/index.php/archives/2005/01/04/18/], ich glaube das dürfte das richtige sein, um zu erfahren, ob nach Deinem Prog noch andere Programme gestartet werden.

Gruss Alf


Delete - Sa 14.08.10 11:00

Entwder regelmäßig alle Prozesse auflisten und gucken, welcher Prozess neu dazu gekommen ist, oder CreateProcess hooken.


Xentar - Sa 14.08.10 15:06

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Dann merk dir halt mit nem Flag, dass du die Meldung "Programm wurde gestartet" schon ausgegeben hast.
Ich glaube er meint nicht sein Programm, sondern

user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
Ich möchte eine Meldung erhalten, sobald ein fremdes Programm ausgeführt wird. Am besten dann noch den Titel des Handles.

Suche mal nach ProzessHandle [http://www.devblog.de/index.php/archives/2005/01/04/18/], ich glaube das dürfte das richtige sein, um zu erfahren, ob nach Deinem Prog noch andere Programme gestartet werden.

Gruss Alf

Joa, das war mir klar.
Hatte das nur so verstanden, dass er das schon hat, mit der Einschränkung, dass bei ihm die Meldung mehrfach erscheint.


LittleBen - Sa 14.08.10 15:07

Regelmäßig alle Prozesse auflisten habe ich mir auch schon überlegt. Aber dies müsste ich ja dann in einen Timer schreiben mit dem Intervall 1 Sekunde, dass es auch wirklich bemerkt welches Programm gerade startet(oder gerade gestartet wurde). Und dann müsste ich ja noch die Listen Vergleichen, wie tu ich das?

Im Moment mache ich dies:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function ActiveCaption: string;
var
  Handle: THandle;
  Len: LongInt;
  Title: string;
begin
  Result := '';
  Handle := GetForegroundWindow;
  if Handle <> 0 then
  begin
    Len := GetWindowTextLength(Handle) + 1;
    SetLength(Title, Len);
    GetWindowText(Handle, PChar(Title), Len);
    ActiveCaption := TrimRight(Title);
  end;
end;

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
 StaticText1.Caption:= ActiveCaption;
end;


Delete - Sa 14.08.10 17:38

Also einen Algorithmus, wie man zwei Listen vergleicht, sollte nicht so schwer zu implementieren sein, wenn man etwas nachdenkt und mal versucht das selber hinzubekommen. Desweiteren würde ich die Listen nur vergleichen, wenn sich an der Prozessanzahl was geändert hat. Und ob man das jede Sekunde machen muss ist auch fraglich. Auch würde ich keinen Timer nehmen, sondern einen Thread, zumindest für den Vergleich der Listen.


ALF - Sa 14.08.10 18:10

Aber mit GetForegroundWindow bekommst Du nicht die Prozesse sondern nur dein eigenes Handle zur Zeit.
Schau Dir diesen lnk [http://vcldeveloper.com/products/products-components/process-info/] mal an. Vielleicht kannst Du es verwenden.
Gruss Alf


Boldar - Di 17.08.10 00:10

Es gab auch mal ein Beispiel von toms aus der DP, wie man sowas mit einem Shellhook macht, aber mein Link darauf ist nicht mehr gültig, und ich weiss nicht, ob ich den Source einfach so rausrücken darf.
Da wurde afaik genau das gemacht, was du benötigst, nämlich Createprocess(ex) und Shellexecute(ex) gehookt.
Früher hatte Luckie das glaube ich auch auf seiner Webseite, aber die scheint sich wohl geändert zu haben.


Gerd Kayser - Di 17.08.10 13:55

Vielleicht von Interesse:
http://www.codeproject.com/KB/system/hooksys.aspx
http://easyhook.codeplex.com/releases/view/24401


LittleBen - Mi 18.08.10 15:52

Dann bedank ich mich jetzt mal bei allen für die Mühen.
Ich bin schon wieder an einem neuem Projekt.

Gruße,
Benny