System - Aktive Prozesse auslesen



  • Hallo,

    wie kann ich überprüfen, ob ein Programm aktiv ist? Ich möchte ein kleines Tool schreiben, das mir anzeigt ob ein Programm aktiv ist und wenn es nicht aktiv ist, soll es nochmal gestartet werden, das soll dann in einem Zeitintervall überprüft werden...

    Hat vieleicht jemand einen Tipp, wie ich das mit dem Borland Builder 5 realisieren kann?

    thx im Voraus ...



  • Die Windows-API FindWindow kann man benutzen um zu prüfen ob eine
    Application läuft.

    HWND FoundWindow = FindWindow(NULL, prgrammname);
    if( FoundWindow == NULL )
    {
    ... programm starten.
    }

    Der Parameter "programmname" ist der Name der laufenden Task, so wie
    sie angezeigt wird, wenn man mit ALT-TAB zwischen Programmen herschaltet.
    Diesen kann man mit
    Application->Title = WindowName;
    vorgeben.

    Gruss
    Juergen



  • naja, bedenkt bitte, dass nicht jede Anwendung ein Fenster hat.
    Um solche Programme berücksichtigen zu können muss man die laufende Programme aus dem Taskmanager auslesen:

    //---------------------------------------------------------------------------
    void TForm1::GetProcessNames(TStrings* AList,DWORD ID)
    {
    if(AList)
    {
        char szProcessName[MAX_PATH] = "unknown";
        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE,ID);
        if(hProcess)
           {
            HMODULE hMod;
            DWORD cbNeeded;
            if (EnumProcessModules( hProcess, &hMod, sizeof(hMod),&cbNeeded) )
                GetModuleBaseName( hProcess, hMod, szProcessName,sizeof(szProcessName) );
           }
        AList->Add(String(szProcessName));
        CloseHandle(hProcess);
    }
    }
    
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    RichEdit1->Lines->Clear();
    DWORD Processes[1024],size,count;
    if (EnumProcesses(Processes,sizeof(Processes),&size))
        for (int i=0;i<int(size/sizeof(DWORD));i++)
            GetProcessNames(RichEdit1->Lines,Processes[i]);
    }
    //---------------------------------------------------------------------------
    

    So kann man übrigens auch den Speicherbedaft und CPU Nutzung auslesen...



  • Ich kann leider grade nicht nachschauen, aber geht das denn nicht nur bei sichtbaren Fenstern? Soweit ich weiss kann man damit Programme in der Taskleiste nicht finden.

    Edit: Ja herrlich, kaum poste ich was bestätigt AndreasW mich.

    [ Dieser Beitrag wurde am 12.06.2003 um 00:02 Uhr von TripH editiert. ]



  • jo *G* 😉



  • um auf diese Mail zu antworten:

    ein mailer schrieb:

    ich habe deinen Beitrag im C++ Forum gelesen "Überprüfen ob Programm aktiv" und versucht diese Sache nachzuvollziehen. Jedoch bekomme ich immer die folgenden Fehlermeldungen:

    Aufruf der undefinierten Funktion 'EnumProcessModules'

    Aufruf der undefinierten Funktion 'GetModuleBaseName'

    Aufruf der undefinierten Funktion 'EnumProcesses'

    man muss natürlich die richtige Header einbinden 😉

    #include "Psapi.h"
    

Anmelden zum Antworten