Text von fremder Status Leiste auslesen



  • 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!!!!!!!!!!!!!!!!!!!!!!



  • Mal ganz allgemein: Wenn ein Code mal nicht so funktioniert, wie du es erwartet, dann hilft meist ein debuggen der Anwendung und eine Überprüfen der Rückgabewerte der aufgerufenen Funktionen. Werden keine erfolgreiche Rückgabewerte erhalten, dann prüfe mit GetLastError() oder der in der MSDN vorgeschlagenen Errorprüfroutine.



  • GetLastError() gibt stets 0 aus. Ich suche ja jeden Part der Statusbar ab. In den meisten Anwendungen, die STATUSCLASSNAME als Klassennamen für die Statusbar benutzen, funktioniert das ja auch. Wieso, weshalb und warum aber nicht beim IE8?? Wenn der Code fehlerhaft wäre, würde er auch in den anderen Programmen nicht funktionieren...



  • player424 schrieb:

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

    http://www.michael-puff.de/Artikel/AccessComCtrl32.shtml



  • Danke für den Link, wieder etwas dazugelernt 👍



  • puff

    oO



  • player424 schrieb:

    Danke für den Link, wieder etwas dazugelernt 👍

    ?? Was tun? Ich komm irgendwie nicht klar damit...


Anmelden zum Antworten