Text ab einem bestimmten Punkt aus einer Edit Box auslesen



  • Hallo,

    ich möchte aus einem anderen Programm aus einem RichEdit reinen Text auslesen. Wie man das komplette Ding ausliest hab ich schon hinbekommen, einfach mit WM_GETTEXT. Jedoch wird eine Angabe erwartet, wieviel Zeichen gelesen werden sollen. Ich kann mir ja mit GETTEXTLENGTH alle Zeichen holen. Mein Problem ist jetzt aber, dass in dem RichEdit eine große Menge an Zeichen steht und mich eigentlich nur die aller letzen sagen wir 50 inetressieren. Die vorherigen 5000 nicht... und ich will nicht immer (es wird oft ausgelesen) ALLES auslesen müssen.

    Gibt es eine möglichkeit, das irgendwie hinzubekommen? Vielleicht von hinten auslesen oder irgendwas?
    Danke für die Hilfe



  • Nach rumforschen hab ich rausgefunden, dass man mit dem RichEdit direkt reden kann.
    Aber wieso funktioniert folgender Code nicht?

    char cBuffer[36];
    
                TEXTRANGEW trw;
                 trw.chrg.cpMin = 15;
                 trw.chrg.cpMax = 50;
                 trw.lpstrText = cBuffer; //Fehlermeldung
    
                SendMessage(edit, EM_GETTEXTRANGE, 0 , (LPARAM)&trw);
    

    Fehlermeldung: warning: assignment from incompatible pointer type

    Hab schon alles mögliche durchprobiert. Er möchte da doch nen Pointer zu nem Buffer haben. Bekomtm er doch.
    Das Gleiche schreib ich auf bei andern Sachen, wie "GetWindowText" zB. Dort ist auch ein Pointer to Buffer verlangt und ich mach es so ...



  • ok... jetzt bin ich soweit gekommen

    wchar_t cBuffer[50];
                TEXTRANGEW trw;
                 trw.chrg.cpMin = 15;
                 trw.chrg.cpMax = 50;
                 trw.lpstrText = cBuffer;
    
                SendMessage(edit, EM_GETTEXTRANGE, 0 , (LPARAM)&trw);
                printf("%s\n", cBuffer);
    

    Ich bekomm jetzt was ausgegeben, nur es sind irgendwelche Zeichen... "ðR£mÿÿÿÿ˜ú!߇mHôj(". Das ist sicherlich nicht das, was in dem RichEdit drinsteht... jemand nde Idee was da los ist?

    edit: Ich hab mal SendMessage ausgeben lassen, dann müsste die Anzahl der kopierten Zeichen ausgegeben werden, da bekomm ich immer 0 ?
    sehr komisch das ganze 😞
    kann es sein, dass man dafür erst den Prozess des fremden Programmes injekten muss oder so?



  • Lumpeh schrieb:

    kann es sein, dass man dafür erst den Prozess des fremden Programmes injekten muss oder so?

    ja so ist es! WM_GETTEXT stellt diesbezüglich einen sonderfall dar, weil es über prozessgrenzen hinweg arbeitet.



  • argh, ok danke.

    Ich hab das mal mit eine Tabelle gemacht, also auf den process zugreifen. Läuft das im Prinzip genauso ab oder?

    GetWindowThreadProcessId(handle_to_edit, &pid);
            process = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ |
                    PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, pid);
    

    und dann muss ich irgendwie auf das edit zugreifen


  • Mod

    Man muss nichts injecten. Du musst aber für TEXTRANGEW den Speicher im fremden Prozess allokieren und diese Adresse dann verwenden.



  • jo sowas meinte ich.
    Werde mal googlen wie man sowas macht. Danke!



  • ich nochmal ..

    also ich komme jetzt schonmal soweit, dass mir die SendMessage Funktion nen int zurückgibt, dass Zeichen aus dem RichEdit ausgelesen wurden.
    D.h. die Zeichen müssen irgendwie in dem Buffer drin sein, aber ich scheitere daran, diese in eine normales char Array zu kopieren. Dieses verdammte wchar_t!

    TEXTRANGE trw, *_trw;    
            GetWindowThreadProcessId(edit, &pid);
            process = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ |
                    PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, pid);     
            _trw = (TEXTRANGE*) VirtualAllocEx(process, NULL, sizeof (TEXTRANGE),
                    MEM_COMMIT, PAGE_READWRITE);           
    
                 wchar_t cBuffer[50];
    
                 trw.chrg.cpMin = 1;
                 trw.chrg.cpMax = 49;
                 trw.lpstrText = (LPSTR)cBuffer;
                 WriteProcessMemory(process, _trw, &trw, sizeof (TEXTRANGE), NULL);
                 printf("%d\n",SendMessage(edit, EM_GETTEXTRANGE, 0 , (LPARAM)_trw));
    
                 wprintf(L"%s\n", cBuffer );
                 VirtualFreeEx(process, _trw, 0, MEM_RELEASE);
    

    So, bei dem Code wird einfach nichts ausgegeben, bis auf 48. Soviel Zeichen hat er erfolgreich kopiert. Doch wohin?
    Am besten wäre es, ich hätte gleich ein stink normales char Array.
    Kann mir jemand helfen?
    Oder mir mal wenigstens sagen, wie ich Testweise mir mal das Array ausgeben kann ...



  • Martin auch keine Idee?
    Jetzt bekomme ich plätzlich auch keine Zeichen mehr von der SendMessage Funktion. Manchmal gehts manchmal nicht. Hab das Gefühl da stimmt noch was ganz gewaltig nicht 🙂


  • Mod

    Kann nicht gehen. cBuffer liegt immer noch in Deinem Speicher.



  • Lumpeh schrieb:

    ich nochmal ..

    also ich komme jetzt schonmal soweit, dass mir die SendMessage Funktion nen int zurückgibt, dass Zeichen aus dem RichEdit ausgelesen wurden.
    D.h. die Zeichen müssen irgendwie in dem Buffer drin sein, aber ich scheitere daran, diese in eine normales char Array zu kopieren. Dieses verdammte wchar_t!

    TEXTRANGE trw, *_trw;    
            GetWindowThreadProcessId(edit, &pid);
            process = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ |
                    PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, pid);     
            _trw = (TEXTRANGE*) VirtualAllocEx(process, NULL, sizeof (TEXTRANGE),
                    MEM_COMMIT, PAGE_READWRITE);           
                
                 
                 wchar_t cBuffer[50];
                 
                 trw.chrg.cpMin = 1;
                 trw.chrg.cpMax = 49;
                 trw.lpstrText = (LPSTR)cBuffer;
                 WriteProcessMemory(process, _trw, &trw, sizeof (TEXTRANGE), NULL);
                 printf("%d\n",SendMessage(edit, EM_GETTEXTRANGE, 0 , (LPARAM)_trw));
    
                 wprintf(L"%s\n", cBuffer );
                 VirtualFreeEx(process, _trw, 0, MEM_RELEASE);
    

    So, bei dem Code wird einfach nichts ausgegeben, bis auf 48. Soviel Zeichen hat er erfolgreich kopiert. Doch wohin?
    Am besten wäre es, ich hätte gleich ein stink normales char Array.
    Kann mir jemand helfen?
    Oder mir mal wenigstens sagen, wie ich Testweise mir mal das Array ausgeben kann ...

    Hallo,

    wenn Du die ProzessID haben willst, musst DU pid vorher mit größer 0 initialisieren:

    pid = 1;
    GetWindowThreadProcessId(edit, &pid);

    sonst returned die Funktion nur mit der ThreadID und die ProcessID wird nicht geliefert. Deshalb heißt diese Foo ja auch genauso.

    Ich bin mir aber nicht sicher, ob dieser Hinweis dein ganzes Problem löst, mir ist nur dieses Detail aufgefallen.



  • Wie bekomm ich cBuffer in den andrren Speicher? Mit VirtualAllocEx?



  • ja



  • Vielleicht noch ne kleine Hilfe, wie ich das mache?



  • habs jetzt so:

    TEXTRANGE trw, *_trw;    
            pid = 1;
            GetWindowThreadProcessId(edit, &pid);
            process = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ |
                    PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, pid);     
            _trw = (TEXTRANGE*) VirtualAllocEx(process, NULL, sizeof (TEXTRANGE),
                    MEM_COMMIT, PAGE_READWRITE);           
    
            printf("%d, %d\n", process, pid);
            char* cBuffer;
            char p[50];
    
             cBuffer = (char*) VirtualAllocEx(process, NULL, 50,
                    MEM_COMMIT, PAGE_READWRITE);             
    
                 trw.chrg.cpMin = 2;
                 trw.chrg.cpMax = 49;
                 trw.lpstrText = (LPSTR)cBuffer;
                 WriteProcessMemory(process, _trw, &trw, sizeof (TEXTRANGE), NULL);
                 printf("%d\n",SendMessage(edit, EM_GETTEXTRANGE, 0 , (LPARAM)_trw));
    
                ReadProcessMemory(process, cBuffer, p, 50, NULL);
                 printf("%s\n", p );
    
                 VirtualFreeEx(process, _trw, 0, MEM_RELEASE);
    

    soweit klappt es, nur er gibt mir jetzt nur das erste Zeichen aus, das er ausliest? Ich finde einfach den Fehler nicht. mein chararray p müsste doch alles von cBuffer kopiert haben ?
    Was auch komisch ist. Wenn ich mir sizeof(cBuffer) ausgebe, bekomm ich eine 4. Aber eigentlich müssten es 50 sein. Ich denke 4, weil nur ein Zeichen drin ist. ein char hat doch 4 byte?
    Also müsste es der Fehler sein, dass nur ein char in cBuffer kopiert wurde... Jedoch zeigt mir die SendMessage Funktion ja an, dass die gewünschten Zeichen kopiert wurden...


  • Mod

    Beschäftige Dich bitte mal mit Unicode und dem Unterschied zu MBCS!
    Dann schau mal in den Puffer rein und Du wirst sehen, dass Du die Daten bekommen hast!



  • ok ich musste alles auf wchar_t umstellen und ausgabe funzt jetzt mit wprintf()

    danke für den Hinweis...


  • Mod

    Nein!
    Umstellung auf TCHAR und _tprintf wäre in jedem Falle kompatibler!


Anmelden zum Antworten