Prozessnamen ermitteln



  • Mit EnumWindows() besorge ich mir die HWNDs aller laufenden Prozesse. Jetzt möchte ich die Prozessnamen = EXE- oder DLL-Files wissen. Wie komme ich an
    diese heran?

    Meine Anftrage ist hinreichend beantwortet. Ich finde, was ich suche!



  • berniebutt schrieb:

    Mit EnumWindows() besorge ich mir die HWNDs aller laufenden Prozesse.

    Tust du nicht. Du holst dir die Handles aller alle Fenster und fenster sind keine Prozesse. Was willst du machen?



  • Hier, diese Funktion sollte dir dienlich sein.

    BOOL ROFLERS_EXECUTABLE_CODE_TO_RETRIEVE_THE_EXECUTABLE_IMAGE_NAME_FROM_HWND(
    							HWND HWND_WINDOW_TO_RETRIEVE_EXECUTABLE_IMAGE_NAME_FROM_IF_POSSIBLE_IF_NOT_JUST_RETURN_FALSE_AND_CALL_GETLASTERROR_TO_FIGURE_OUT_WHAT_WENT_WRONG,
    							LPSTR BUFFER_THAT_WILL_RECEIVE_THE_NAME_OF_THE_EXECUTABLE_IMAGE_FOR_THE_HWND_PASSED_AS_FIRST_PARAMETER,
    							DWORD SIZE_OF_THE_BUFFER_THAT_WILL_RECEIVE_THE_NAME_OF_THE_EXECUTABLE_IMAGE ) {
    	DWORD PROCESS_ID_OF_THE_PROCESS_THE_HWND_BELONGS_TO;
    	HANDLE PROCESS_HANDLE_OF_THE_PROCESS_DESCRIBED_ABOVE;
    	BOOL BOOLEAN_VARIABLE_THAT_WILL_BE_RETURNED_TO_INDICATE_SUCCESS_OR_FAILURE_OF_THE_FUNCTION_RESPECTIVELY;
    	GetWindowThreadProcessId(HWND_WINDOW_TO_RETRIEVE_EXECUTABLE_IMAGE_NAME_FROM_IF_POSSIBLE_IF_NOT_JUST_RETURN_FALSE_AND_CALL_GETLASTERROR_TO_FIGURE_OUT_WHAT_WENT_WRONG,
    							 &PROCESS_ID_OF_THE_PROCESS_THE_HWND_BELONGS_TO);
    	PROCESS_HANDLE_OF_THE_PROCESS_DESCRIBED_ABOVE = OpenProcess(MAXIMUM_ALLOWED, FALSE,
    		PROCESS_ID_OF_THE_PROCESS_THE_HWND_BELONGS_TO);
    	BOOLEAN_VARIABLE_THAT_WILL_BE_RETURNED_TO_INDICATE_SUCCESS_OR_FAILURE_OF_THE_FUNCTION_RESPECTIVELY =
    		GetModuleFileNameEx(PROCESS_HANDLE_OF_THE_PROCESS_DESCRIBED_ABOVE, NULL,
    		BUFFER_THAT_WILL_RECEIVE_THE_NAME_OF_THE_EXECUTABLE_IMAGE_FOR_THE_HWND_PASSED_AS_FIRST_PARAMETER,
    		SIZE_OF_THE_BUFFER_THAT_WILL_RECEIVE_THE_NAME_OF_THE_EXECUTABLE_IMAGE);
    	CloseHandle(PROCESS_HANDLE_OF_THE_PROCESS_DESCRIBED_ABOVE);
    	return BOOLEAN_VARIABLE_THAT_WILL_BE_RETURNED_TO_INDICATE_SUCCESS_OR_FAILURE_OF_THE_FUNCTION_RESPECTIVELY;
    }
    


  • PS. Habe versucht, den Variablen aussagekräftige Namen zu geben, damit der Code leichter verständlich ist.



  • Jeder Prozess hat ein Hauptfenster HWND. Mit diesem bekomme ich u.a. die interne
    ProzessID und den Fenstertitel. Das läuft mit EnumWindows() einwandfrei und
    liefert die Informationen für alle laufenden Prozesse. Ich möchte wissen, welche
    EXE- oder DLL-Datei den Prozess gestartet hat.



  • berniebutt schrieb:

    Jeder Prozess hat ein Hauptfenster HWND.

    Und das stimmt nicht zwangsläufig. Man denke an Services...


  • Mod

    Schon ein simples Conso9len Programm muss kein Fenster haben!



  • Informationen zu allen laufenden Prozessen kannst du mit der Funktion CreateToolhelp32Snapshot, dem dabei verwendeten Flag TH32CS_SNAPPROCESS und anschliessendem Durchlaufen mittels Process32First/Process32Next erhalten. Der Name der Executable ist dort ebenfalls enthalten.



  • Danke für die hilfreichen Beiträge!
    Roflers Funktion ist o.k. Hier meine Anwort-Funktion:

    BOOL Berniebutt (){
    BOOL bDaddeldu=TRUE;
    // Some changes needed for CBuilder1:
    // ... OpenProcess(PROCESS_ALL_ACCESS,...);
    // ... GetModuleFileName(...) instead of GetModuleFileNameEx(...);
    return bDaddeldu;
    }

    O.K, einige Prozesse haben HWND = NULL, doch die interessieren mich nicht!



  • berniebutt schrieb:

    Jeder Prozess hat ein Hauptfenster HWND.

    Und wie stellt du sicher, dass du das Handle des Hauptfensters hast? Oder andersrum gefragt, was unterscheidet ein Hauptfenster von einem nicht Hauptfenster?


Anmelden zum Antworten