ListBox kann nicht gefunden werden ?!



  • 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;
    }
    

    ...


Anmelden zum Antworten