An Fensterhandle kommen
-
Hallo,
ich muss aus einem Treeview Daten auslesen, komme aber nicht so recht
an das eigentliche Treeview ran. In Spy++ stellt es sich etwa so dar:->Fenster 0066542 ""ATL:023DE870
|--->Fenster 00205C0 ""ATL:023DE870
|--->Fenster 12345X0 ""ATL:023DE870
.|----->Fenster 45121 "" TreeView20WndClassDiese ATL-Fensterdinges gibt es mehrfach und ich finde irgendwie wohl
immer nur das erste, müsste aber in das zweite rein, weil darunter
das Treeview liegt.Kann man irgendwie diese Handlenummer die direkt nach "Fenster" kommt
direkt mit angeben, oder ist die auf jedem PC unterschiedlich?Mein Versuch war soweit dieser hier:
//.. if(child = ::FindWindowEx(child,0,"ATL:023DE870",0)) { if(child = ::FindWindowEx(child,0,"ATL:023DE870",0)) { if(child = ::FindWindowEx(child,0,"TreeView20WndClass",0)) { ::SendMessage(child,WM_GETTEXT,255,(long)&buffer[0]); CString tmp = &buffer[0]; AfxMessageBox(tmp); }else { MessageBox("treeview nicht gefunden"); } }else { MessageBox("zweites atl-fenster nicht gefunden"); } } else { MessageBox("erstes atl-fenster nicht gefunden!"); }Ich erhalte meine Meldung, dass das Treeview nicht gefunden wurde...
-
Halloo habe das Fenster jetzt bekommen, kann gerne die Lösung posten am
Montag (Wochenende juhuuu!!).Nur jetzt weiss ich nicht, wie ich am besten die Daten aus dem externen Treeview
mit SendMessage abhole.Mein Versuch ist vermutlich totaler Käse

TVITEM tvi; ZeroMemory(&tvi,sizeof(tvi)); tvi.mask=TVIF_PARAM; ::SendMessage(child,TVM_GETITEM,0,(long)&tvi); CString val; val=tvi.pszText; MessageBox(bb,"Wert des Eintrages im Treeview");
-
Jein, nicht ganz. Also wenn du als .mask = TVIF_PARAM angibst, dann wird dir die GetItem Funktion auch nur .lParam füllen und nix anderes. Wenn du .pszText haben willst musst du:
1. einen Buffer dafür bereitstellen
2. die Buffergröße in die Itemstruktur eintragen
3. TVIF_TEXT für die .mask angeben
-
4. einen gültigen Handle auf ein Item unter .hItem angeben
-
Du kannst aus dem Treeview gar nichts abholenn, wenn das Fenster zu einem anderen Prozess gehört. Dazu müsstest Du Code in diesen Prozess injezieren, oder anderes schweinisches machen.
Alle Zeiger, die Du übergibst beziehen sich immer auf Deinen Prozess und sind in dem anderen Prozess ungültig.
-
Hallo,
ich habe mich weiter im Forum umgesehen und auch eine Lösung gefunden.
Dabei verstehe ich noch nicht, wie man durch die ganzen Einträge des
Treeview enumerieren kann (also an Unterelemente ran kommt).Ich erhalte immer das Rootelement, was wohl an TVGN_ROOT liegt.
Aber an welcher Stelle baue ich eine for-schleife o.ä. ein?
Ich muss ja irgendwie effektiv TVM_GETNEXTITEM nutzen können
Sorry für meine absolute Unwissenheit, aber könnte mir jemand weiterhelfen?
Hier der relevante Teil:
GetWindowThreadProcessId(hWnd3, &procid); hproc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, procid); pt = VirtualAllocEx(hproc, NULL, sizeof(tvItem), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); tvItem.mask = TVIF_TEXT | TVIF_HANDLE ; tvItem.pszText = (LPSTR)pt; tvItem.cchTextMax = 100; it=(HTREEITEM)::SendMessage(hWnd3, TVM_GETNEXTITEM, TVGN_ROOT, 0); tvItem.hItem = it; WriteProcessMemory(hproc, pt,&tvItem, sizeof(tvItem), NULL); ::SendMessage(hWnd3, TVM_GETITEM, 0, (LONG)pt); ReadProcessMemory(hproc, pt,&tvItem, sizeof(tvItem), NULL); ReadProcessMemory(hproc, LPCVOID(pt),&buffer, sizeof(buffer), NULL); MessageBox(buffer,"Eintrag im Treeview"); VirtualFreeEx(hproc, pt, 0, MEM_RELEASE); CloseHandle(hproc);
-
Ok, habe gefunden wie ich die Untereinträge vom Root durchlaufen kann (lParam):
it=(HTREEITEM)::SendMessage(hWnd3, TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM)it);Und für die Childs darunter dann:
it=(HTREEITEM)::SendMessage(hWnd3, TVM_GETNEXTITEM,TVGN_CHILD, (LPARAM)it);Mal sehen wie ich das sinnvoll in eine Funktion packe um rekursiv alles zu durchlaufen
