Text von fremder Status Leiste auslesen
-
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!!!!!!!!!!!!!!!!!!!!!!
-
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, dieSTATUSCLASSNAMEals 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.
-
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...