Neuen Prozess erkennen



  • Hallo,

    ich als C Neuling möchte gerne ein kleines Programm schreiben, was laufende Prozesse sowie neugestartete und terminierte aufzeichnet. Mir fehlen hier natürlich die Funktionen. Ich habe bisher folgenden lauffähigen C Code geschrieben: Etwas ausm C-Buch, sowie hier aus dem Forum.

    #include <windows.h>
    #include <tlhelp32.h>
    #include <stdio.h>
    
    void prozesscheck (void *dummy);
    
    int weiter = 1;
    
    main() {
    	int done;
    	_beginthread(prozesscheck,0,NULL);
    	scanf("%i",&done);
    	weiter = 0;
    }
    
    void prozesscheck (void *dummy) {
    	//char prozess[10];
    	HANDLE prozesse;
    	PROCESSENTRY32 pe32;
    
    	prozesse = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    	pe32.dwSize = sizeof(PROCESSENTRY32);
    	//do {
    		//printf("%s\n",pe32.szExeFile);
    		if (lstrcmp(pe32.szExeFile,"explorer.exe")) {
    			printf("Explorer gefunden");
    		}
    	//} while (Process32Next(prozesse,&pe32));
    	CloseHandle(prozesse);
    }
    

    Das Programm soll später im Hintergrund laufen und wenig Ressourcen verbrauchen. Ich habe hier bereits mit Multithreading gearbeitet, damit ich es bequem terminieren kann. Das Problem ist nun, dass ich einen neuen Prozess erkennen will, hierfür habe ich mir bereits Gedanken gemacht. Der für mich momentan klarste wäre, dass ich jedes mal einen neuen "Snapshot" aller laufenden Prozesse mache und diesen mit dem vorhergehenden (wahrscheinlich in einer Datei gespeicherten) Vergleiche und somit Unterschiede rausfiltere. Wenn ich aber nun folgende Zeile in eine Schleife packe:

    prozesse = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    

    ist die CPU-Last nicht mehr tragbar.

    Ich denke, dass hier bestimmt nicht die eleganteste und/oder effizienteste Lösung vollbracht habe, vielleicht kann mir hierzu einer ein paar Verbesserungen vorbringen. Aber meine wichtigste Frage wäre hier, ob es eine Möglichkeit gibt neue/beendete Prozesse leichter zu erkennen, ohne dabei die CPU im Leerlauf vollkommen auszumerzen.

    Danke,
    Xim





  • Das sieht so aus, als ob das genau das ist, was ich brauche...

    Danke dir 🙂



  • Welche Bibliothek außer die Psapi muss ich denn noch für "GetProcessImageFileName" linken, in der MSDN finde ich hierzu nix weiter. Oder beudetet folgender Fehler was anderes? "Undefined Reference to 'GetProcessImageFileName'".

    Danke euch,
    Xim

    Nachtrag:
    Die Psapi ist garantiert eingebunden, da "EnumProcesses" diese auch benötigt und nachmdem linken der Fehler hierzu verschwunden ist.



  • Requirements
    Client Requires Windows XP.
    Server Requires Windows Server 2003.

    Evtl. ist dein SDK zu alt...



  • Das ist natürlich auch möglich, da ich auch über Google, etc. keine anderen Betroffenen gefunden habe. Mir schwirrt aber auch schon eine andere Lösung im Kopf rum, nur hierfür müsste ich wissen, wie ich bspw. auf Mausklicks außerhalb des aktiven Fensters reagieren kann. Wenn ich dies mit

    case WM_LBUTTONDOWN: {
    // Anweisung...
    }
    

    realisieren will, werden nämlich nur die Klicks registriert, die innerhalb des aktiven Fensters getätigt wurden. Ich habe mich hier im Forum auch schon durch diverse Threads über "Hooks" und "Keyloggern" durchgeackert, aber nicht wirklich das passende gefunden.

    Der Sinn ist der, dass jedesmal wenn die Maus gedrückt wurde, in meinem Programm eine Schleife gestartet wird.



  • Du willst jetzt bei jedem Klick alle Prozesse durchgehen und schauen, ob ein neuer hinzugekommen ist?! Dafür bräuchtest du einen Hook in ner DLL oder du machst einfach nen Timer - ist aber halt alles wohl nicht so elegant...


Anmelden zum Antworten