TreeView aus fremder App lesen?



  • Hallo,
    ich möchte z.B. aus Teamspeak2 die Usernamen wissen.
    Das Programm hat ein TreeView und die User sind einzelne Items.

    Ich bekomms aber einfach nicht hin den Text auszulesen!
    Hier mein Ansatz:

    HWND hWnd;
            HWND hWnd2;
            HWND hWnd3;
            HTREEITEM it;
            TVITEMEX tvItem = {0};
            TCHAR buffer[100];
    
            hWnd = FindWindow(0,"TeamSpeak 2");
            hWnd2 = FindWindowEx(hWnd,0,"TPanel",0);
            hWnd3 = FindWindowEx(hWnd2,0,"TTreeView",0);
    
        tvItem.mask = TVIF_TEXT | TVIF_HANDLE;
        tvItem.pszText = buffer;
        tvItem.cchTextMax = 100;
    
        it=TreeView_GetFirstVisible(hWnd3);
        //it=TreeView_GetNextItem(hWnd3, it, TVGN_CHILD);
        tvItem.hItem = it;
    
        //TreeView_DeleteItem(hWnd3,it); <--- Das funktioniert !!!
    
        TreeView_GetItem(hWnd3, &tvItem); //Rückgabe der Funktion ist false aber warum?
    

    Im Buffer steht danach nix drin und der Returnwert von GetItem ist false.
    Und nach Spy++ steht in meinen hWnd3 auch das richtige Window-Handle.

    Hat irgendjemand ne Ahnung?

    THX schon mal


  • Mod

    Das ist so nicht möglich. Der Speicherbereich den Du angibst um das Item auszulesen liegt in Deinem Prozess. Nicht in dem des Treeviews.

    Du müsstest also einen Speicherbereich im fremden Prozess allokieren, diesen befüllen, dan die Nachricht absenden, dann die Daten in Deinem Prozess auslesen.

    Jeffrey Richter beschreibt das in seinem DIPS: Desktop Icon Positions Saver!
    http://www.amazon.de/Microsoft-Windows-Programmierung-für-Experten/dp/3860633368

    Schau Dir mal die Doku zu den folgenden Funktionen an:
    OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, VirtualFreeEx

    So in etwa ist das die Reighenfolge der Befehle. Nach dem WriteProcessMemory, kannst Du dann die Anfrage mit SendMessage stellen.



  • ok danke für den hinweis...
    hört sich irgendwie logisch an wenn man mal darüber nachdenkt. 😉

    Habs jetzt nach deinem Schema programmiert aber ich glaub ich mach da irgendwas falsch...

    Schauts euch mal an:

    HWND hWnd;
            HWND hWnd2;
            HWND hWnd3;
            HTREEITEM it;
            HANDLE hproc;
            TCHAR buffer[100];
            DWORD procid;
            TVITEM tvItem={0};
            LPVOID pt;
    
            hWnd = FindWindow(0,"TeamSpeak 2");
            hWnd2 = FindWindowEx(hWnd,0,"TPanel",0);
            hWnd3 = FindWindowEx(hWnd2,0,"TTreeView",0);
    
            GetWindowThreadProcessId(hWnd3, &procid);
    
            hproc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, procid);
    
            pt = VirtualAllocEx(hproc, NULL,  sizeof(tvItem), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    
            tvItem.mask = TVIF_TEXT | TVIF_HANDLE ;
            tvItem.pszText = buffer;
            tvItem.cchTextMax = 100;
            it=(HTREEITEM)SendMessage(hWnd3, TVM_GETNEXTITEM, TVGN_ROOT, 0);
            tvItem.hItem = it;
    
            WriteProcessMemory(hproc, pt,&tvItem, sizeof(tvItem), NULL);
    
            SendMessage(hWnd3, TVM_GETITEM, 0, (LONG)pt);
    
            ReadProcessMemory(hproc, pt,&tvItem, sizeof(tvItem), NULL);
    
            VirtualFreeEx(hproc, pt, 0, MEM_RELEASE);
    
            CloseHandle(hproc);
    

    nach dem ausführen kommt ne windows message "Access violation at address...".
    ich glaub ich hab was mit den pointern verhunzt.



  • Die Adresse von "buffer [100]" muss noch angepasst werden. Probier mal, ob Du folgende "Obszönitäten :-)" gecastet kriegst :

    // tvItem.pszText = buffer;
    tvItem.pszText = (pt + 400);
    ...
    ReadProcessMemory(hproc, pt,&tvItem, sizeof(tvItem), NULL);
    ReadProcessMemory(hproc, (pt + 400),&buffer, sizeof(buffer), NULL); // <- noch zusätzlich
    


  • jo danke das mit den 400 konnt ich mir nicht erklären deswegen hab ich nochmal mit
    VirtualAllocEx nen speicher reserviert...

    danke für die super hilfe.

    klappt jetzt alles wunderbar.

    THX
    mfg
    -Gashirn



  • Hey Gashirn,

    kannst Du nochmal Deine komplette Lösung posten (ich hoffe, Du hast sie noch).

    Ich habe versucht, die Lösung zu übernehmen, aber bei mir haut das irgendwie nicht hin.

    Vielen Dank schon mal!


Anmelden zum Antworten