Text von fremder Status Leiste auslesen



  • player424 schrieb:

    OK ich habs. Folgender Code hat bei mir funktioniert. Ist etwas umständlich, aber wohl die einzige Lösung.

    char *buffer;
    char text[100];
    DWORD pid;
    HANDLE process;
    HWND hwnd=FindWindow(NULL, "Unbenannt - Editor");
    GetWindowThreadProcessId(hwnd, &pid);
    process=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    buffer=VirtualAllocEx(process, 0, 100, MEM_COMMIT, PAGE_READWRITE);
    SendMessage(child, SB_GETTEXT, 1, (LPARAM)buffer);
    ReadProcessMemory(process, buffer, text, 100, 0);
    VirtualFreeEx(process, buffer, 100, MEM_DECOMMIT);
    CloseHandle(process);
    // mach was mit text
    

    Der Code ist allerdings noch ausbaufähig. Z.B. müsste man vorher mit SB_GETTEXTLENGTH noch die Länge abfragen und natürlich die ganzen Rückgabewerte der Funktionen checken. Das habe ich der einfachheit halber aber mal weggelassen.

    Edit: Denk auch daran das Debug-Privileg zu setzen wenn du keinen Zugriff auf den Prozess erhälst.

    Danke... Aber "child" ist nicht definiert, ich kanns leider nicht selbst beheben.



  • ääähhh

    HWND child;
    

    😉

    An der Stelle noch mal der Hinweis das du den Code nicht 1:1 übernehmen solltest.



  • player424 schrieb:

    ääähhh

    HWND child;
    

    😉

    An der Stelle noch mal der Hinweis das du den Code nicht 1:1 übernehmen solltest.

    😃 ja, nur weiß ich nicht, wie du an das Handle gekommen bist... Wenn ich es nur deklariere, ists ja undefiniert. Ich bitte um ein Beispiel. 😋

    #include <iostream>
    #include <windows.h>
    #include <CommCtrl.h>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    char *buffer;
    char text[100];
    DWORD pid;
    HWND child;
    HANDLE process;
    HWND hwnd=FindWindow(0, "Google - Windows Internet Explorer");
    GetWindowThreadProcessId(hwnd, &pid);
    process=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    buffer=(char*)VirtualAllocEx(process, 0, 100, MEM_COMMIT, PAGE_READWRITE);
    SendMessage(NULL, SB_GETTEXT, 1, (LPARAM)buffer);
    ReadProcessMemory(process, buffer, text, 100, 0);
    VirtualFreeEx(process, buffer, 100, MEM_DECOMMIT);
    CloseHandle(process);
    // mach was mit text 
    cout << text;
    system("pause");
    }
    

    Geht leider nich...



  • Oh sorry vergessen 🙂 . Also so komme ich ohne Probleme an das Handle

    FindWindowEx(hwnd, 0, STATUSCLASSNAME, 0);
    


  • player424 schrieb:

    Oh sorry vergessen 🙂 . Also so komme ich ohne Probleme an das Handle

    FindWindowEx(hwnd, 0, STATUSCLASSNAME, 0);
    

    Ich nicht!

    Kann es an den Berechtigungen liegen, wie du schon erwähntest? SE_DEBUG



  • Nein um an ein Fensterhandle zu kommen braucht man soweit ich weiss keine extra Berechtigungen. Du solltest einmal überprüfen ob der Aufruf von FindWindow scheitert (Fenstertitel falsch geschrieben z.B.).



  • player424 schrieb:

    Nein um an ein Fensterhandle zu kommen braucht man soweit ich weiss keine extra Berechtigungen. Du solltest einmal überprüfen ob der Aufruf von FindWindow scheitert (Fenstertitel falsch geschrieben z.B.).

    FindWindow(); scheitert nicht - komisch... Mein Zielfenster ist der Internet Explorer 8.

    EDIT: Habe grad gemerkt, dass es beim Editor funktioniert... Wieso nicht beim IE 8?



  • Bei mir funktioniert es beim Internet Explorer auch nicht. Ich kann mir das höchstens damit erklären, dass der IE nicht die native Statusbarklasse nutzt, sondern irgendein Ownerdraw-Zeugs macht.



  • Ich hab mal die Childs vom IE8 ausgegeben:

    BrowserFrameGripperClass 00260444
    WorkerW 000C0A3E
    ReBarWindow32 002F08E0
    TravelBand 000907D4
    ToolbarWindow32 00390464
    Address Band Root 000F010C
    AddressDisplay Control 000A0A7E
    Edit 001D0B46
    ToolbarWindow32 00210172
    ToolbarWindow32 000B0B98
    UniversalSearchBand 001D0810
    Search Control 006F0164
    Static 000F08D0
    Edit 00140722
    ToolbarWindow32 00050856
    ToolbarWindow32 001E0510
    CommandBarClass 000A0ABC
    ReBarWindow32 00360618
    CommandToolbarBand 00260468
    ToolbarWindow32 006403EE
    TabBandClass 002A0B7C
    DirectUIHWND 005F00FE
    FavBandClass 003309E4
    ToolbarWindow32 00DC03EC
    LinksBandClass 0004094A
    ToolbarWindow32 00340A98
    ToolbarWindow32 003F0984
    Frame Tab 001C0B9E
    InternetToolbarHost 0049040A
    WorkerW 00090B1E
    ReBarWindow32 00060858
    ToolbarWindow32 000507DE
    ToolbarWindow32 00060948
    ToolbarWindow32 000607E8
    TabWindowClass 002C0BD2
    msctls_statusbar32 001B040E
    ToolbarWindow32 00130312
    ToolbarWindow32 00200828
    msctls_progress32 000D08A8
    Shell DocObject View 00330658
    Internet Explorer_Server 00080848
    

    Das kam raus. Habs dann mit "msctls_statusbar32" bei FindWindowEx() probiert -> wieder nichts! Macht einen verrückt, der Scheiß.



  • Hab mir den Code nicht vollständig angeschaut, aber diese Zeile springt einem ja förmlich ins Gesicht:

    SendMessage(NULL, SB_GETTEXT, 1, (LPARAM)buffer);
    


  • #include <iostream>
    #include <windows.h>
    #include <CommCtrl.h>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    char *buffer;
    char text[100];
    DWORD pid;
    HWND child;
    HANDLE process;
    HWND hwnd=FindWindow(0, "Google - Windows Internet Explorer");
    child = FindWindowEx(hwnd, 0, STATUSCLASSNAME, 0);
    GetWindowThreadProcessId(hwnd, &pid);
    process=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    buffer=(char*)VirtualAllocEx(process, 0, 100, MEM_COMMIT, PAGE_READWRITE);
    SendMessage(child, SB_GETTEXT, 1, (LPARAM)buffer);
    ReadProcessMemory(process, buffer, text, 100, 0);
    VirtualFreeEx(process, buffer, 100, MEM_DECOMMIT);
    CloseHandle(process);
    // mach was mit text
    cout << text;
    system("pause");
    }
    

    Geht auch so nicht.



  • Nun ich weiss nicht warum FindWindowEx hier nicht richtig funktioniert. Aber mit EnumChildWindows kommst du ja an den Handle der Statusbar. Benutz also einfach diese Funktion.



  • player424 schrieb:

    Nun ich weiss nicht warum FindWindowEx hier nicht richtig funktioniert. Aber mit EnumChildWindows kommst du ja an den Handle der Statusbar. Benutz also einfach diese Funktion.

    #include <iostream>
    #include <windows.h>
    #include <CommCtrl.h>
    
    using namespace std;
    
    HWND pp;
    BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) {
    	char buf[50];
    
    	 GetClassName(hwnd,buf,50);    
    	 if(!strcmp(buf,"msctls_statusbar32"))
    		 pp=hwnd;
         return TRUE; // must return TRUE; If return is FALSE it stops the recursion
    }
    
    int main(int argc, char *argv[])
    {
    char *buffer;
    char text[100];
    DWORD pid;
    HANDLE process;
    HWND hwnd=FindWindow(0, "Google - Windows Internet Explorer");
    EnumChildWindows(hwnd, EnumChildProc, 0);
    GetWindowThreadProcessId(hwnd, &pid);
    process=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    buffer=(char*)VirtualAllocEx(process, 0, 100, MEM_COMMIT, PAGE_READWRITE);
    SendMessage(pp, SB_GETTEXT, 1, (LPARAM)buffer);
    ReadProcessMemory(process, buffer, text, 100, 0);
    VirtualFreeEx(process, buffer, 100, MEM_DECOMMIT);
    CloseHandle(process);
    // mach was mit text
    cout << text;
    system("pause");
    }
    

    Geht auch nicht... Also entweder ich bin ein Vollidiot oder das ist ein Bug in der API.



  • Du solltest prüfen welche Funktion genau scheitert. Oder wird einfach nur kein Text angezeigt? Bist du sicher, dass im Panel 1 der Statusbar auch Text steht?



  • player424 schrieb:

    Du solltest prüfen welche Funktion genau scheitert. Oder wird einfach nur kein Text angezeigt? Bist du sicher, dass im Panel 1 der Statusbar auch Text steht?

    Kein Text. Die Funktionen scheinen alle zu funktionieren. GetLastError() gibt 0 aus. Welches Panel ist denn nr. 1? Ist das Abhängig vom Programm? Ich dachte immer, dass das, was ganz links steht, Panel 1 ist und dass man das auch defualtmäßig als erstes erreicht per Gettext.



  • Die Panels fangen bei 0 an. Genau wie bei einem Array 😉



  • player424 schrieb:

    Die Panels fangen bei 0 an. Genau wie bei einem Array 😉

    EDIT:

    Ich habe jetzt per SB_GETPARTS herausgefunden, dass der IE8 13 Parts hat. Wie steuere ich einzelne davon an?

    #include <iostream>
    #include <windows.h>
    #include <CommCtrl.h>
    
    using namespace std;
    
    HWND pp;
    BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) {
    	char buf[50];
    
    	 GetClassName(hwnd,buf,50);    
    	 if(!strcmp(buf,"msctls_statusbar32"))
    		 pp=hwnd;
         return TRUE;
    }
    
    int main(int argc, char *argv[])
    {
    char *buffer;
    char text[100];
    DWORD pid;
    HANDLE process;
    HWND hwnd=FindWindow(0, "Google - Windows Internet Explorer");
    EnumChildWindows(hwnd, EnumChildProc, 0);
    GetWindowThreadProcessId(hwnd, &pid);
    process=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    buffer=(char*)VirtualAllocEx(process, 0, 100, MEM_COMMIT, PAGE_READWRITE);
    SendMessage(pp, SB_GETTEXT, 1, (LPARAM)buffer);
    int num = 0;
    num = SendMessage(pp, SB_GETPARTS, 0, (LPARAM)0);
    cout << num;
    ReadProcessMemory(process, buffer, text, 100, 0);
    VirtualFreeEx(process, buffer, 100, MEM_DECOMMIT);
    CloseHandle(process);
    // mach was mit text
    cout << text;
    system("pause");
    }
    

    SB_GETTEXT gibt 0 also:

    `The text is drawn with a border to appear lower than the plane of the window.

    `
    aus.

    MSDN sagt:

    If your application uses a status bar that has only one part, you can use the WM_SETTEXT, WM_GETTEXT, and WM_GETTEXTLENGTH messages to perform text operations. These messages deal only with the part that has an index of zero, allowing you to treat the status bar much like a static text control.

    Quelle: http://msdn.microsoft.com/en-us/library/bb760728%28VS.85%29.aspx



  • #include <iostream>
    #include <windows.h>
    #include <CommCtrl.h>
    
    using namespace std;
    
    HWND pp;
    BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) {
        char buf[50];
    
         GetClassName(hwnd,buf,50);    
         if(!strcmp(buf,"msctls_statusbar32"))
             pp=hwnd;
         return TRUE;
    }
    
    int main(int argc, char *argv[])
    {
    char *buffer;
    DWORD pid;
    HANDLE process;
    HWND hwnd=FindWindow("IEFrame",0);
    EnumChildWindows(hwnd, EnumChildProc, 0);
    GetWindowThreadProcessId(hwnd, &pid);
    process=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    buffer=(char*)VirtualAllocEx(process, 0, 100, MEM_COMMIT, PAGE_READWRITE);
    int num = 0, n = 0;
    num = SendMessage(pp, SB_GETPARTS, 0, (LPARAM)0);
        for(int i =  0; i < num; ++i)
         { 
          n =  LOWORD(SendMessage(pp, SB_GETTEXT, (WPARAM)i, (LPARAM)buffer));
          char *text = new char[n];
    
          ReadProcessMemory(process, buffer, text, n, (SIZE_T *)n);
    
          if(text != "")
            MessageBox(0, text,0,0);
         } 
    
    VirtualFreeEx(process, buffer, 100, MEM_RELEASE);
    CloseHandle(process);
    system("pause");
    }
    

    So hab ichs versucht. Kein Erfolg.



  • #include <iostream>
    #include <windows.h>
    #include <CommCtrl.h>
    
    using namespace std;
    
    HWND pp;
    BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) {
        char buf[50];
    
         GetClassName(hwnd,buf,50);    
         if(!strcmp(buf,"msctls_statusbar32"))
             pp=hwnd;
         return TRUE;
    }
    
    int main(int argc, char *argv[])
    {
    char *buffer;
    char text[100];
    DWORD pid;
    HANDLE process;
    HWND hwnd=FindWindow(0, "Google - Windows Internet Explorer");
    EnumChildWindows(hwnd, EnumChildProc, 0);
    GetWindowThreadProcessId(hwnd, &pid);
    process=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    buffer=(char*)VirtualAllocEx(process, 0, 100, MEM_COMMIT, PAGE_READWRITE);
    int num = 0;
    num = SendMessage(pp, SB_GETPARTS, 0, (LPARAM)0);
    for(int i = 0; i < num; ++i)
    {
    SendMessage(pp, SB_GETTEXT,(WPARAM)i, (LPARAM)buffer);
    ReadProcessMemory(process, buffer, text, 100, 0);
    cout << i << " " << text;
    }
    VirtualFreeEx(process, buffer, 100, MEM_DECOMMIT);
    CloseHandle(process);
    // mach was mit text
    system("pause");
    }
    

    Das geht nicht....



  • HELFT MIR bitte!!!!!!!!!!!!!!!!!!!!!!


Anmelden zum Antworten