# [C++] Prüfen ob eine bestimmte .exe gerade läuft



## Carndret (14. Juni 2003)

Wie kann ich prüfen ob eine Anwendung deren Pfad ich kenne gerade läuft?
Und wie kann ich davon das Fenster Handle bekommen um Nachrichten zu schicken (z.B. Tastaturanschläge)?


----------



## Dario Linsky (14. Juni 2003)

Das Fensterhandle kannst Du mit der FindWindow-Funktion kriegen, aber dazu brauchst Du den Titel des Fensters (also das, was in der Titelleiste angezeigt wird). Mit dem Dateinamen kannst Du so direkt erstmal nichts anfangen. Aber soweit ich weiss, kriegst Du über die ShellExecute-Funktion das Handle der aufgerufenen Anwendung zurück. Und darüber kannst Du ja wieder den Titel auslesen.
Ist zwar etwas umständlich so, aber eine andere Möglichkeit fällt mir nicht ein...


----------



## Carndret (14. Juni 2003)

Was mich auch weiterbringen würde, wäre, wenn ich wüsste welche Prozesse/Anwendungen zur Zeit laufen. Also das, was man bei Strg+Alt+Entf im Prozessfenster sieht.
Wenn ich da die ganze Liste bekommen könnte, habe ich ja auch wieder den exe Namen den ich dann vergleichen kann.
Geht das irgendwie?


----------



## Daniel Toplak (15. Juni 2003)

Mit der API-Funktion EnumProcesses() kann man die laufenden Prozesse enumieren, was man dann erhält ist laut MSDN ein array von ProcessID's mit dieses Array kann man denke ich wiederum durchlaufen und feststellen welche Prozesse das sind, so kann man denke ich auf die ausführende .EXE kommen.
Ich hoffe das hilft dir etwas weiter. Such einfach mal in der MSDN oder bei Google nach Beispielen von EnumProcesses().

Gruss Homer


----------



## Patrick Kamin (15. Juni 2003)

*-*


```
DWORD PIDArray[1023];
DWORD cb;
Int i;
Int ProcCount;
HMODULE hMod;
THandle hProcess; // THandle ist Delphi spezifisch, musst mal gucken, was du dafür nehmen musst
Char ModuleName[300];

EnumProcesses(&PIDArray, SizeOf(PIDArray), cb);
ProcCount = cb / SizeOf(DWORD);
for(i = 0; i >= ProcCount-1; i++)
  hProcess = OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PIDArray[i]);
  if(hProcess != 0)
    EnumProcessModules(hProcess, &hMod, SizeOf(hMod), cb);
    GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));
    cout << ModuleName << endl; // In ModuleName steht dann der Name Anwendung
```

Ich hab den Code nur in Object Pascal gehabt, hab ihn zwar schon ein bisschen angepasst, musst aber trotzdem mal schaun, was du noch ändern musst.


----------



## Dario Linsky (15. Juni 2003)

> Ich hab den Code nur in Object Pascal gehabt, hab ihn zwar schon ein bisschen angepasst, musst aber trotzdem mal schaun, was du noch ändern musst.


Also sizeof, int und char sollten auf jeden Fall klein geschrieben werden. Bei false bin ich nicht sicher, aber es sollte entweder FALSE oder false heissen. 
THandle ist auch nicht unbedingt Delphi-spezifisch, sondern würde auch im C++ Builder funktionieren. Trotzdem solltest Du meiner Meinung nach anstelle von THandle besser HWND benutzen.

Mehr fällt mir spontan nicht auf.


----------



## Daniel Toplak (15. Juni 2003)

Also anstatt THandle verwende bitte HANDLE und der Aufruf von EnumProcesses ist so nicht ganz richtig. Wie Lirion schon sagte, 'sizeof' wird klein geschrieben und außerdem liefert dir sizeof(PIDArray) => 4 zurück, da das ein Zeiger auf das Array ist, also müsstest du die Größe des Array folgenermaßen berechnen:
sizeof(1023*sizeof(DOWRD))
damit hast du die Tatsächliche Größe des Arrays.
Ich habe mal etwas gesucht und hier ein gutes Beispiel gefunden: (Benötigt aber immer das Plattform SDK von MS)
http://www.codeproject.com/threads/w32process.asp

Gruss Homer


----------



## Carndret (15. Juni 2003)

Ja, ich denke das reicht mir. Ich brauch ja nur den "Hauptbefehl". Wie das dann genau aussieht ist dann eine andere Sache. Ob da nur sizeof groß geschrieben wird ist ja egal, es geht ja nur um's Programmiertechnische.

Danke für eure Hilfe!


----------

