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

Carndret

Erfahrenes Mitglied
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)?
 
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...
 
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?
 
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
 
-

Code:
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.
 
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. :)
 
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
 
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!
 
Zurück