Fremdes Control auslesen
-
Jochen, das Ergebnis:
HWND hAimWindow, hReadingControl, hInputControl, hWantedCtrl; LPARAM text=(LPARAM)_T("blabla test"); LRESULT lResult; TCHAR text2[255]; LPWSTR text3; int len; hAimWindow = FindWindow(_T("AIM_ChatWnd"), NULL); hReadingControl = FindWindowEx(hAimWindow, NULL,_T("WndAte32Class"), NULL); hInputControl = FindWindowEx(hAimWindow, hReadingControl, _T("WndAte32Class"), NULL); hWantedCtrl = FindWindowEx(hInputControl, NULL, _T("Ate32Class"), NULL); len = ::SendMessage(hWantedCtrl,WM_GETTEXTLENGTH,0,0);/*GetWindowTextW(hWantedCtrl,text3,len);*/ GetWindowText(hWantedCtrl,text2,len); String^ s = gcnew String(text2); this->label2->Text = s; this->label1->Text = Convert::ToString(len);label2: bei leerem Editfeld kommen chinesische, oder japanische Zeichen raus, wenn etwas in dem Editcontrol steht bleibt es leer..:(:(:(:(:(:(:(:( ich verzweifel langsam dadran!
rul0r:
WM_GETTEXT soll genauso nicht prozessübergreifend sein.habs damit probiert, und habs auch nicht hinbekommen...vielleicht lags an meiner inkompetenz?
wenn du mal ein beispiel code hast, wär ich dir sehr dankbar rul0r
-
Welches OS?
-
DaMapfi schrieb:
WM_GETTEXT soll genauso nicht prozessübergreifend sein.
MSDN schrieb:
GetWindowText cannot retrieve the text of a control in another application.
[...]
To retrieve the text of a control in another process, send a WM_GETTEXT message directly instead of calling GetWindowText.
-
Jochen: Windows 7

rul0r: moment...
-
rul0r alta, alter Cheater!
also ja, mein erster Ansatz war es auch mit WM_GETTEXT..hab mal in nem anderen Forum dazu was geposted....Respond:
You're not serious...
It has been explained millions of times on Win32 groups (http://tinyurl.com/cmhb5g and others)
(WM_GETTEXT being inter-process)muss ich nun auch noch Englisch lernen? Heißt das nicht soviel wie....Es ist nur Prozess-Intern?! oO
Aber i thank You So MUCH! Ich Cleane gleich mein code und poste ihn mal hierrein
-
Hatte ich nicht geschrieben, dass es ab Vista nicht mehr geht?
Such mal nach UIPI...
http://msdn.microsoft.com/en-us/library/bb756960.aspx
-
HWND hAimWindow, hReadingControl, hInputControl, hWantedCtrl; LRESULT lResult; TCHAR text[255]; int len; hAimWindow = FindWindow(_T("AIM_ChatWnd"), NULL); hReadingControl = FindWindowEx(hAimWindow, NULL,_T("WndAte32Class"), NULL); hInputControl = FindWindowEx(hAimWindow, hReadingControl, _T("WndAte32Class"), NULL); hWantedCtrl = FindWindowEx(hInputControl, NULL, _T("Ate32Class"), NULL); len = ::SendMessage(hWantedCtrl,WM_GETTEXTLENGTH,0,0); lResult = ::SendMessage(hInputControl,WM_GETTEXT,len,(LPARAM)text2); String^ s = gcnew String(text2); this->label2->Text = s; this->label1->Text = Convert::ToString(len);so sieht nun mein Code aus, eine Frage habe ich noch dazu, wie kann ich dir Größe von text "variabel" machen? Einfach vor der Deklaration len ermitteln und das als index nehmen?
-
Ja, Jochen hattest du. Ich habe mir den Inhalt der Variablen zwar nicht genau angeguckt, wegen magelnder Label2 Größe, doch habe ich schon die HTML-Tags drinstehen sehen, also zieht er tatsächlich den Text aus dem Control
-
Hatte noch einige Fehler in dem Code, hier der berichtigte:
HWND hAimWindow, hReadingControl, hInputControl, hWantedCtrl; LRESULT lResult; TCHAR text[255]; int len; hAimWindow = FindWindow(_T("AIM_ChatWnd"), NULL); hReadingControl = FindWindowEx(hAimWindow, NULL,_T("WndAte32Class"), NULL); hInputControl = FindWindowEx(hAimWindow, hReadingControl, _T("WndAte32Class"), NULL); hWantedCtrl = FindWindowEx(hInputControl, NULL, _T("Ate32Class"), NULL); len = ::SendMessage(hWantedCtrl,WM_GETTEXTLENGTH,0,0); lResult = ::SendMessage(hInputControl,WM_GETTEXT,len,(LPARAM)text); String^ s = gcnew String(text); this->label2->Text = s; this->label1->Text = Convert::ToString(len);Edit: Am Ende des ausgelesen Textes, sind aber noch "komische" Zeichenfolgen, wie kann man das beheben? Oder ist es evtl, wegen einer fehlenden NULL-Beendung des "Strings"?
-
Hier noch die Doku:
http://msdn.microsoft.com/en-us/library/aa922085.aspxAm Ende des ausgelesen Textes, sind aber noch "komische" Zeichenfolgen, wie kann man das beheben? Oder ist es evtl, wegen einer fehlenden NULL-Beendung des "Strings"?
Ja, das könnte sein. Probiers doch mal aus.
-
Du solltest konsistent sein, beim allozieren des Speichers und der maximalen Länge des Textes:
HWND hWnd = FindWindow(NULL, _T("Inbox - Microsoft Outlook")); // Variante 1. // Buffer (text -> LPARAM) hat fixe Länge, es wird soviel wie nötig // beschrieben, aber nie mehr als 256 (len -> WPARAM) { TCHAR text[256] = {}; SendMessage(hWnd, WM_GETTEXT, 256, (LPARAM) text); } // Variante 2. // Buffer (text) hat hat genau die benötigte Länge (sie wurde ja ermittelt), // muss daher aber auf dem Heap mit new[] angelegt und mit delete[] wieder // freigegeben werden (alternativ könnte auch std::vector<T> verwendet werden). { LRESULT len = SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0); TCHAR* text = new TCHAR[len + 1]; // 1 character reserved for terminating null. SendMessage(hWnd, WM_GETTEXT, len + 1, (LPARAM) text); delete[] text; }Simon
-
Thx Simon, habe nicht daran gedacht das +1 mit reinzuschreiben.
Und zu der Konsistent, klar logisch...aber sowas fällt einem immer erst dann auf, wenn man den Post schon abgeschickt hat
Trotzdem riesen Dankeschön!Nun stehe ich noch vor dem Problem, dass der Chatroom erst bei rund 8.5 mio Zeichen abschmiert.
Natürlich kann ich diese Menge von Zeichen nicht einfach auslesen und Piesselfatz damit machen...
Allein das GET_TEXTLENGHT dauert schon seine paar Sekunden.
Mir würden rund 200 Zeichen vollkommen reichen....ALLERDINGS...vom Ende dieses Textes...
Gibt es eine möglichkeit sich direkt nur das Ende von dem Inhalt zu erhaschen?Klar, man könnte alles lesen und den String dann einfach zurecht stutzen, was ich im notfall auch tun werde.
Greez
DaMapfi qΘ↓Θρ