Mit EnumWindows(...) verstecktes Fenster finden



  • Hallo,

    ich habe folgendes Problem.
    Ich lese mit EnumWindows alle möglichen Fenster aus, die sich so bieten.
    In der CALLBACK Funktion hole ich mir die Klassennamen und WindowTExte der Fenster.

    Jetzt gibt es Progs, wie zum Beispiel eDonkey, die man auf dem X rechts oben, wo normal die Anwendung geschlossen wird, sich in den Tray minimieren. Dort finde ich sie dann mit meiner Vorgehensweise nicht mehr. Wenn Sie in der Taskbar leiegn oder offen sind klappt alles noch super.

    Wie kann ich es anstellen, dass ich diese verdammte Anwendung auch in diesem Zustand entdecken kann?

    Mein Code bisher:

    #include <windows.h>
    #include <stdio.h>
    #include <fstream.h>
    #include <iostream>
    
    const int CLASS_COUNT = 40;
    const int WND_COUNT = 40;
    
    BOOL CALLBACK EnumWindowsProc (HWND hwnd, LPARAM lParam);
    
    //----------------------------------------------------------------------
    //----------------------------------------------------------------------
    void main (void)
    {
        TCHAR  lpTitle[WND_COUNT] = "";   // title string of console
        LPARAM lParam = 0;
        BOOL   bRet;
    
        bRet = EnumWindows ((WNDENUMPROC)EnumWindowsProc, lParam);
    
        cout << endl << lpTitle << endl;
    
        getchar();
        return;
    }
    
    //----------------------------------------------------------------------
    // Callback routine of EnumWindows()
    //----------------------------------------------------------------------
    BOOL CALLBACK EnumWindowsProc (HWND hwnd, LPARAM lParam)
    {
        int nMaxCount = CLASS_COUNT;        // size of class name buffer
        int i = 0;
        TCHAR lpClassName[CLASS_COUNT] = TEXT("");
        TCHAR lpWindowName[CLASS_COUNT] = TEXT("");
        int iRet;
    
        iRet = GetClassName(           hwnd, // handle to the window
                                       (LPTSTR)lpClassName,  // class name
                                       nMaxCount // size of class name buffer
                                       );
    
        iRet = GetWindowText(          hwnd, // handle to the window
                                       (LPTSTR)lpWindowName,  // class name
                                       nMaxCount // size of class name buffer
                                       );
    
        for( i=0; i<WND_COUNT; i++ )
             lpWindowName[i] = tolower(lpWindowName[i]);
    
        if( strstr(lpWindowName,"emule") )
        {
            cout << endl << lpClassName;
            cout << endl << lpWindowName;
        }
        else if( strstr(lpWindowName,"edonkey") )
        {
            cout << endl << lpClassName;
            cout << endl << lpWindowName;
        }
    
        return TRUE;
    }
    

    Danke im Voraus,
    mid.



  • Hallo,

    EnumWindows
    This function enumerates all top-level windows on the screen.

    FindWindow
    The FindWindow function retrieves the handle to the top-level window whose class name and window name match the specified strings.

    😕 😉 😃



  • Ich verstehe schon, was Du mir sagen willst, aber ich wollte die EnumWindows ja benutzen, um eine Liste der Fenster zu bekommen. Da ich die Klasse des Fensters, das ich suche nicht genau weiß. Oder besser gesagt, ist die etwas sprunghaft.
    Der neue eDonkey (hybridversion) hat folgende Klasse: "Afx:400000:0" und eMule "#32770". Das Problem stellt der alte eDonkey Client dar. Da ändert sich der ClassName irgendwie stetig. Besser gesagt, ein Teil davon. Der Klassenname fängt wie beim Hybridesel mit "Afx:400000:" an. Es sieht immer so ähnlich aus: "Afx:400000:b:10011:6:XXXXX". Die X variieren dann immer.

    Ich habe das jetzt mal durchgetestet und er findet sowohl den neuen Hybridesel, als auch den alten donkey-Client, wenn ich nach der Klasse "Afx:400000:0" suche.

    Ich weiß jetzt aber nicht, ob es sicher ist, sich darauf zu verlassen. Hab zwar mittlerweile den Eindruck, dass es so ist und die 0 nach dem : für beliebige Forsetzung (quasi als Wildcard) steht, aber ich kenne mich dazu zu wenig mit dieser Geschichte von den Fensterklassen aus, um das sicher zu entscheiden. Vielleicht könnte mir da mal einer ne aussagekräftige Meinung geben?

    Mit FindWindow finde ich die eDonkeys auch im Tray, das stimmt auf jeden Fall.

    Mir wäre es nur sicherer alle Fenster oder besser gesagt laufenden Prozesse durchzugehen, den Fenstertitel zu ermitteln, um Ihn auf das Vorkommen von "emule" od. "edonkey" zu untersuchen. Falls da jemand nen Tip hat, wie ich das mache ohne EnumWindows zu benutzen, dass den Esel im Tray nicht findet, wäre ich hocherfreut. 😃

    Ich dank' Euch im Voraus.

    MfGr,
    mid



  • Hi,

    wäre es für dich nicht einfacher nach der Anwendung zu suchen, anstatt nach dem Fenster. Der Name des laufenden Prozesse ist doch sicher immer gleich, oder?

    Mit Process32First und Process32Next kannst du dir eine Liste à la Taskmanager machen.

    Grüße, Volle.



  • Danke, probiere ich gleich mal aus. 🙂

    NACHTRAG: Funktioniert perfekt!!! 🙂
    Fettes Dankeschön an Dich!

    [ Dieser Beitrag wurde am 22.02.2003 um 08:22 Uhr von Midnighter editiert. ]


Anmelden zum Antworten