Text von fremder Status Leiste auslesen
-
Benutz EnumChildWindows und GetClassName (vielleicht nicht die beste Lösung, sollte aber funktionieren).
-
#include <windows.h> #include <Commctrl.h> int main() { HWND hwnd = FindWindow(0,"Google - Mozilla Firefox 4.0 Beta 3"); HWND statushwnd = FindWindowEx(hwnd,0,STATUSCLASSNAME,0); }So hab ichs versucht. GetLastError() gibt 0 aus, aber statushwnd bekommt keinen Wert ?!
-
Ich hab das ganze jetzt mal selbst versucht. Ich bin soweit gekommen, dass ich den Handle der Statusbar habe. Allerdings stürzen mein und das Zielprogramm immer beim auslesen des Texts ab. Ich weiss noch nicht genau warum.
Edit: Hab auch schon GlobalAlloc versucht, hat aber nicht geholfen.
-
#include <iostream> #include <windows.h> #include <CommCtrl.h> using namespace std; BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) { HWND statushwnd; char buf[256], buf2[256]; GetClassName(hwnd,buf,256); if (!strcmp("msctls_statusbar32",buf)) statushwnd = GetWindow(hwnd,GW_CHILD); SendMessage(statushwnd,SB_GETTEXT,0,(LPARAM)buf2); cout << buf2; return TRUE; } int main() { HWND hwnd = FindWindow(0, "Google - Windows Internet Explorer"); EnumChildWindows(hwnd, EnumChildProc, 0); system("PAUSE"); return 0; }Diesmal so und wieder ohne Erfolg!

-
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 textDer 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.
-
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 textDer 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 HandleFindWindowEx(hwnd, 0, STATUSCLASSNAME, 0);
-
player424 schrieb:
Oh sorry vergessen
. Also so komme ich ohne Probleme an das HandleFindWindowEx(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 00080848Das 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.