Informationen über einen Prozess ?



  • Vielen Dank,

    hast Du eventuell auch ein kleines Beispiel ??
    Gruß
    andy_mann



  • such mal in der msdn nach FindWindow, bzw. FindWindowEx, und Post- bzw. SendMessage



  • Servus,

    Bsp.:

    CWnd * pWnd = FindWindow(0, "Unbenannt");
    pWnd->PostMessage(WM_CLOSE);
    

    Wenn ein Fenster jetzt unbenannt heisst, dann schließt er nun das Fenster.

    Ansonsten mit EnumWindowProc() arbeiten.

    Bsp.:

    HWND handle;
    
    BOOL CALLBACK CDeinDlg::EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
    	TCHAR szBuffer[256];
    	memset(szBuffer,0,sizeof(szBuffer));
    
    	::GetWindowText(hwnd, szBuffer, sizeof(szBuffer));
    	if (szBuffer[0] == 'U' && szBuffer[1] == 'n' 
    		&& szBuffer[2] == 'b' && szBuffer[3] == 'e'
    		&& szBuffer[4] == 'n' && szBuffer[5] == 'a' 
    		&& szBuffer[6] == 'n' && szBuffer[7] == 'n'
    		&& szBuffer[8] == 't')	
    	{
    		((CDeinDlg *)lParam)->handle = hwnd;			
    	}
    
    	return TRUE;
    }
    
    //Aufruf
    ::EnumWindows(EnumWindowsProc, (LPARAM)this);
    CWnd *pWnd = FromHandle(handle);
    
    pWnd->PostMessage(WM_CLOSE);
    

    Ich hoffe ich konnte dir weiterhelfen.

    *winke*
    Hellsgore



  • MMhhh...

    vielen Dank,

    ich brauche aber nicht das eigene Fenster, sondern suche ein geöffnetes Programm was ich auf die max. Dauer an in Arbeit überprüfen möchte, und entsprechend reagieren möchte.

    Es soll kein Dialo oder so geöffnet sein sondern im Hintergrund laufen.

    Wie bekomme ich eigentlich den Handle von einem Prozess ??

    Gruß
    andy_mann



  • Servus,

    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    PROCESSENTRY32 proc; 
    proc.dwSize = sizeof(PROCESSENTRY32); 
    Process32First(snapshot, &proc); 
    
    do 
    { 
        if (proc.szExeFile == "ZiehderKatzeamSchwanz")
           MachWas;                 
    }while (TRUE == Process32Next(snapshot, &proc) );
    

    Damit kanns du schonmal den Prozess suchen 😃 . Vielleicht ist dir damit schonmal ein wenig weitergeholfen. Der Rest k.A...........

    Vielleicht: Wenn du den Prozess gefunden hast, kannst du einen Timer starten der den Prozess alle 5sek "überwacht" (ob er vorhanden ist, ggf. Auslastung) und dann darauf reagieren.....

    *winke*
    Hellsgore



  • He, super...
    vielen Dank,

    habe den Source mal eingebracht, leider findet er keine exe.

    Habe es mit verschiedenen geöffneten Programmen brobiert.
    Aber er schruppt in der Schleiffe einfach drüber...

    Gruß
    andy_mann



  • Oh sorry,

    er geht doch in die Schleiffe, war nur zu schnell um es zu erkennen.

    Gruß
    andy_mann



  • Hallo,

    jetzt habe ich dennoch nocheinmal eine Frage,
    der Source funkt ja richtig super, man bekommt die ID heraus usw.
    Jetzt benötige ich aber die CPU-Zeit dieses Prozesses, habs mit Handle probiert, aber kein erfolg...

    Gruß
    andy_mann



  • Schuß ins blaue....

    Wenn du das Handle des Prozesses hast, dann könntest du GetProcessTimes() (glaube ich) die Entstehungszeit bekommen und dann diese mit der aktuellen Zeit verrechnen, um dann auf die tatsächliche aktive Zeit zu kommen. Hab mir aber nicht alles in der MSDN dazu durchgelesen. Musst du mal gucken:

    BOOL GetProcessTimes(
      HANDLE hProcess,
      LPFILETIME lpCreationTime,
      LPFILETIME lpExitTime,
      LPFILETIME lpKernelTime,
      LPFILETIME lpUserTime
    );
    

    *winke*
    Hellsgore

    EDIT:
    Hab hier gerade noch was gefunden, damit kann man die geschriebenen und gelesenen Daten an und von einem Prozess ermitteln -> GetProcessIoCounters() vielleicht kannst du das auch gebrauche..... 🙂

    EDIT2:
    Prozess beenden / killen mit: ExitProcess() / TerminateProcess()



  • Vielen Dank für die Hilfe,

    wie bekomme ich eigentlich jetzt die Zeiten heraus ??

    FILETIME CreationTime; 
    FILETIME ExitTime; 
    FILETIME KernelTime; 
    FILETIME UserTime; 
    GetProcessTimes(snapshot, &CreationTime, &ExitTime, &KernelTime, &UserTime);
    

    wie gehts jetzt weiter ?? 😕

    GRuß
    andy_mann



  • Du kannst z.B. die Klasse CTime benutzen:

    FILETIME CreationTime;
    
    CTime tZeit = CTime(CreationTime);
    int iH = tZeit.GetHour();
    int iM = tZeit.GetMinute();
    
    //usw.
    

    *winke*
    Hellsgore



  • Vielen Dank,

    trotzdem muß ich nochmals nachfragen,

    if (m_strEXE == "notepad.exe") // System Prozess
    {
    GetProcessTimes(snapshot, &CreationTime, &ExitTime, &KernelTime, &UserTime);
    
    CTime tZeit = CTime(CreationTime); 
    int iH = tZeit.GetHour(); 
    int iM = tZeit.GetMinute();
    int iS = tZeit.GetSecond();
    
    cout << m_strEXE << " " << proc.th32ProcessID << " " << iH << iM << iS << endl;
    }
    

    es kommt aber immer nur für
    iH = 1
    iM = 0
    iS = 0
    heraus.

    MAche ich was falsch ??

    GRuß
    andy_mann



  • Servus,

    also ich habe jetzt mal ne Funktion (mit Hilfe von MSDN) erstellt, welche dir die Zeit aller Prozesse auflistet. Naja zumindestens erstmal in eine Variable reinschreibt.

    FILETIME CreationTime; 
    	FILETIME ExitTime; 
    	FILETIME KernelTime; 
    	FILETIME UserTime; 
    
    	HANDLE hProcess; 
    	HANDLE hProcessSnap = NULL; 
        PROCESSENTRY32 pe32      = {0}; 
    	DWORD dwPriorityClass; 
    
        //Einen Snapshot über alle Prozesse erstellen
        hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    
        if (hProcessSnap == INVALID_HANDLE_VALUE) 
            return; 
    
        //Zuerst füllen... 
    
        pe32.dwSize = sizeof(PROCESSENTRY32); 
    
    	//Alle Process durchlaufen
    
        if (Process32First(hProcessSnap, &pe32)) 
        { 
            do 
            { 
    			hProcess = OpenProcess (PROCESS_QUERY_INFORMATION, FALSE, pe32.th32ProcessID); 
    			dwPriorityClass = GetPriorityClass (hProcess); 
    			GetProcessTimes(hProcess, &CreationTime, &ExitTime, &KernelTime, &UserTime);
    
    			//Wenn eine Falsche CreationTime kommt dann abfangen....
    			TRY
    			{
    				CTime tZeit = CTime(CreationTime);
    				int iDay = tZeit.GetDay();
    				int iMonth = tZeit.GetMonth();
    				int iYear = tZeit.GetYear();
    				int iHour = tZeit.GetHour();
    				int iMinute = tZeit.GetMinute();
    				int iSecond = tZeit.GetSecond();
    
    				CString strProcess;
    
    				strProcess.Format("%s - %02d.%02d.%d - %02d:%02d:%02d",
    									pe32.szExeFile,			
    									iDay,
    									iMonth,
    									iYear, 
    									iHour, 
    									iMinute, 
    									iSecond);
    
    				//Hier kannst du jetzt noch die Threads vom Handle herausfinden oder
    				//die ID oder was du gerade für Information von deinem Prozess brauchst.
    				//Das Handle zu dem Prozess ist "hProcess" damit kannst du im Prinzip
    				//jede Schweinerei anfangen.... Viel Spass *g*
    
    				CloseHandle (hProcess); 
    			}
    			CATCH_ALL(e)
    			{
    
    			}
    			END_CATCH_ALL;
    
            } 
            while (Process32Next(hProcessSnap, &pe32)); 
        } 
        CloseHandle (hProcessSnap);
    

    Im strProcess steht dann immer der Prozessname und die Erstellungszeit. Ist aber unsauber mit CATCH_ALL programmiert. Solltest du nochmal drüberschauen und ausbessern. Ist ja nur ein Beispiel. Aber ich denke mal damit kannst du einiges anfangen...

    *winke*
    Hellsgore



  • Hallo,
    wow, vielen Dank, das muß ich mir mal rein ziehen, sieht ziemlich gut aus.
    Bin alerdings gerade an einer anderen Ecke beschäftigt würde mich dann gerne nochmals Melden falls es wo hängt..

    Gruß und Danke
    andy_mann



  • Hallo,

    jetzt habe ich doch noch ein paar schwirigkeiten,

    Habe mir mal mit cout den wert ausgeben lassen:

    GetProcessTimes(hProcess, &CreationTime, &ExitTime, &KernelTime, &UserTime); 
    
    CTime tZeit = CTime(CreationTime); 
    int iDay = tZeit.GetDay(); 
    int iMonth = tZeit.GetMonth(); 
    int iYear = tZeit.GetYear(); 
    int iHour = tZeit.GetHour(); 
    int iMinute = tZeit.GetMinute(); 
    int iSecond = tZeit.GetSecond(); 
    
    CTimeSpan m_tsProzessZeit(NULL,iHour,iMinute,iSecond); 
    
    CString strProcess; 
    
    strProcess.Format("%s - %02d.%02d.%d - %02d:%02d:%02d", 
    pe32.szExeFile,            
    iDay, 
    iMonth, 
    iYear, 
    iHour, 
    iMinute, 
    iSecond);
    
    m_strEXE = pe32.szExeFile;
    
    cout << m_strEXE << " " << strProcess << " " << m_tsProzessZeit.GetSeconds() << endl;
    

    Das einsige was stimmt ist der Name:
    Für cout:
    notepad.exe 007C2A7C 23

    Auch habe ich versucht den Prozess zu beenden mit:

    WORD dwExitCode = -1;
    GetExitCodeProcess(hProcess, &dwExitCode);
    TerminateProcess(hProcess,0);
    CloseHandle(hProcess);
    

    aber keines der oben genannten Funktionen hat ne auswirkung gezeigt.

    Der Task läuft munter weiter..

    Kann mir jemand helfen ??

    Gruß und DAnke
    andy_mann


Anmelden zum Antworten