ListBox kann nicht gefunden werden ?!
-
Also ... hab mir ne kleine Anwendung geschrieben, die mir den Inhalt einer ListBox ausließt ... AutoVScroll ist deaktiviert und ich kann was nicht lesen (Windows Key-Aktuallisierungstool ... Anzeige der defekten Dateien) ...
Das Anwendungsfenster wird gefunden... dann will ich mit GetDlgItem einen Handle auf das Child-Control (hab mir die ID mit Spy++ geholt) 1016 bekommen ... geht nicht! Das Handle ist == NULL ... wie kann das sein? Wie könnte das Control geschützt sein, dass das nicht geht? Hatte es auch schon mit FindWindowEx versucht ... geht auch nicht!
Source
int main() { std::cout << "ListBox - Element ContentVIEW V0.1 BETA\n"; bool exist = false; ::HWND hWndParent = NULL; do { std::cout << "Fenstername: " << std::flush; std::string window_name; std::getline(std::cin, window_name); hWndParent = ::FindWindowA(NULL, window_name.c_str()); if (hWndParent == NULL || ::IsWindow(hWndParent) == FALSE) std::cerr << "Das Fenster \"" << window_name << "\" existiert nicht!" << std::endl; else exist = true; } while (exist != true); std::cout << "ListBox - ID: " << std::flush; int window_id = 0; while (!(std::cin >> window_id)) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } ::HWND hWndList = ::GetDlgItem(hWndParent, window_id); if (hWndList == NULL) { std::cerr << "ListBox konnte nicht identifiziert werden!" << std::endl; format_error(::GetLastError()); return close_wait(); } LRESULT nListItemCount = ::SendMessageA(hWndList, LB_GETCOUNT, 0, 0); if (nListItemCount == LB_ERR) { std::cerr << "Das Element ist keine ListBox!" << std::endl; format_error(::GetLastError()); return close_wait(); } for (int item = 0; item < static_cast<int>(nListItemCount); ++item) { unsigned int len = static_cast<unsigned int>(::SendMessageA(hWndList, LB_GETTEXTLEN, item, 0)); char* arr = new char[len + 1]; ::SendMessageA(hWndList, LB_GETTEXT, item, (LPARAM)arr); arr[len] = 0; std::cout << (item + 1) << ": " << arr << std::endl; delete [] arr; } return close_wait(); }...
-
Der Parent der "ListBox" ist das "First Child" der Dialogbox. Hat zufälligerweise gleiche Eigenschaften wie die Dialogbox.

-
Möp jetzt nochmal bidde ^^ Ral gerade nicht was du meinst ... meinst de hWndParent ist nicht korrekt in dem Fall?
-
Die Dialogbox hat ein Child, dessen "Windowtext" und Klassenname identisch ist mit denen der Dialogbox.
Dieses Child (und nicht die Dialogbox) ist der Parent der ListBox.

-
Hmm ... nen Versuch wert ... werde es mal versuchen

-
Hm mit welchem Fenster hast Du es denn probiert? Bei mir funktioniert das nämlich
.merker schrieb:
Die Dialogbox hat ein Child, dessen "Windowtext" und Klassenname identisch ist mit denen der Dialogbox.
Das geht eigentlich gar nicht. Oder ich verstehe Dich falsch
.
-
Ich werd jetzt einfahc mimt EnumChildWindow mal nochmal durchsehen was so da ist

Das Fenster ist von "Windows Key-Aktualisierungstool" ...
-
Oh sorry, stimmt hast Du ja schon geschrieben -überlesen, sry-. Hab das Programm, aber ist das denn eine reine Listbox? (ListView's oder AfxListboxen, erkennt er IMHO schon nit mehr als ListBox).
Achja: Um zu verifizieren, ob es sich wirklich um eine ListBox handelt, würde ich eher der Ergebnis von GetClassName verwenden, glaub das ist 'präziser' (also die Strings vergleichen).
-
CodeFinder schrieb:
Das geht eigentlich gar nicht.
Doch, das geht. Das ist ja gerade das lustige an dem Aktualisierungstool. Da hält sich jemand nicht an seine eigenen Designerrichtlinien.

Ich habe eine Art SpyXX-Tool, das die Hierarchie wie folgt darstellt :|-> Popup {#32770:Dialog} "Wind...." (Style : 0x9CC800C4 Popup,Visible,...) | |-> Child {#32770:Dialog} "Wind...." (Style : 0x50010444 Child,Visible,...) | |-> Child ... |-> Child {ListBox} (Style : 0x50000001 Child,Visible,...) |-> Child ...Ich vermute mal, dass FindWindow () bei Dir zufälligerweise das richtige Fenster gefunden hat.
-
Achsoooo...
-
...joar jetzt weiß ich wie Du das meintest. Dachte erst Du meinst, dass das Listbox-Control und der Dialog den gleichen Klassennamen haben.merker schrieb:
Ich vermute mal, dass FindWindow () bei Dir zufälligerweise das richtige Fenster gefunden hat.
Ne. Die gesamte Situation war bei mir anders, da ich -wie schon gesagt- das Programm was (D)Evil verwendet hat, gar nicht habe. Habs mit 'nem selbstgeschriebenen probiert
.
-
Hmm ... das komische ist folgendes ... wenn ich mit enumchildwindows die window ausgeben lasse, bekomme ich auch das hwnd des controls ... aber sonnst nicht ... da ist doch was faul

-
Soo ... jetzt aber ... nen bissel gefrickelt aber egal:
int close_wait(); void format_error(const unsigned long); BOOL CALLBACK enum_child_proc(HWND, LPARAM); #undef max struct data { HWND hWnd; int search_id; data(int id) : search_id(id), hWnd(NULL) {} }; template<typename T> std::size_t digits(T const& num) { if (num == 0) return 1; T tmp(num); std::size_t i = 1; for (; tmp > 0; ++i) tmp /= 10; return i; } int main() { std::cout << "<< ====== Hauptfenster ====== >>" << std::endl; bool exist = false; ::HWND hWndParent = NULL; do { std::cout << "Beschriftung: " << std::flush; std::string window_name; std::getline(std::cin, window_name); hWndParent = ::FindWindowA(NULL, window_name.c_str()); if (hWndParent == NULL || ::IsWindow(hWndParent) == FALSE) std::cerr << "Das Fenster \"" << window_name << "\" existiert nicht!" << std::endl; else exist = true; } while (exist != true); std::cout << ">> ====== Hauptfenster ====== <<" << std::endl; std::cout << "<< ======== List-Box ======== >>\n" << "< ID: " << std::flush; int window_id = 0; while (!(std::cin >> window_id)) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } data search(window_id); EnumChildWindows(hWndParent, enum_child_proc, reinterpret_cast<LPARAM>(&search)); ::HWND hWndList = search.hWnd; if (hWndList == NULL) { std::cerr << "Das Element mit der ID existiert nicht!" << std::endl; format_error(::GetLastError()); return close_wait(); } LRESULT nListItemCount = ::SendMessageA(hWndList, LB_GETCOUNT, 0, 0); if (nListItemCount == LB_ERR) { std::cerr << "Das Element mit der ID ist keine List-Box!" << std::endl; format_error(::GetLastError()); return close_wait(); } std::cout << ">> ======== List-Box ======== <<\n" << std::endl; std::cout << "<< ==== Element - Inhalt ==== >>" << std::endl; std::size_t item_count = static_cast<std::size_t>(nListItemCount); std::size_t digit_count = digits(item_count); for (std::size_t item = 0; item < item_count; ++item) { std::size_t len = static_cast<unsigned int>(::SendMessageA(hWndList, LB_GETTEXTLEN, item, 0)); char* arr = new char[len + 1]; ::SendMessageA(hWndList, LB_GETTEXT, item, reinterpret_cast<LPARAM>(arr)); arr[len] = 0; std::cout << std::setw(digit_count) << (item + 1) << ": " << arr << std::endl; delete [] arr; } std::cout << ">> ==== Element - Inhalt ==== <<" << std::endl; return close_wait(); } int close_wait() { std::cout << "Press any key to continue" << std::endl; std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cin.get(); return 0; } void format_error(const unsigned long err) { LPVOID lpMsgBuf = NULL; ::FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast<char*>(&lpMsgBuf), 0, NULL); std::cerr << "FEHLER: " << static_cast<char*>(lpMsgBuf) << std::endl; ::LocalFree(lpMsgBuf); } BOOL CALLBACK enum_child_proc(HWND hWndChild, LPARAM lParam) { data * search = reinterpret_cast<data*>(lParam); if (GetWindowLongA(hWndChild, GWL_ID) == search->search_id) search->hWnd = hWndChild; return TRUE; }...