Verstaendnisproblem!, mit "EnumChildWindows + EnumChildProc" ...



  • aehm jaaa? und wie, was passiert da jetzt? ich steig da irgendwie net ganz durch


  • Mod

    Das geht weitaus einfacher mit der Fubktion GetWindow (GW_CHILD, GW_NEXT)!



  • ja und wie?



  • Win32 Programmer's Reference

    Guggst Du hier: http://www.codingcrew.de/programmierung/win32hlp.php


  • Mod

    T0bi schrieb:

    ja und wie?

    In dem man anfängt zum Beispiel die Doku zu lesen:

    for (HWND hWnd=::GetWindow(hWndParent,GW_CHILD); hWnd; hWnd = ::GetWindow(hWnd,GW_HWNDNEXT))
    {
    ...
    }
    


  • also ich habe des jetzt mal so versucht wies der martin vorgeschlagen hat, und er erkännt schon mal das ich 9Childs habe, doch will ich mir den text noch ausgeben lassen den das jeweilige child besitzt.
    Hier mein Ansatz

    int main( int argc, char* argv[] ) {
    
        HWND hWnd;
        string sWindow;             // searched window
        string Window_text;         // childwindows text
        char *szBuffer;
        int iLength = 0;
        int i = 1;
    
        cout << "\n Please enter here the windowname, witch one you want: ";
        cin >> sWindow;
        cout << endl;
        cin.sync();
    
            hWnd = FindWindow( 0, sWindow.c_str() );
                if( !( hWnd ) ) {
    
                    textcolor( LIGHTRED );
                    cprintf( "\n Error, couldn't found window.\n" );
                    getchar();
                    return 0;
                }
                else {
    
                    textcolor( LIGHTGREEN );
                    cprintf( "\n Ok, the window could found.\n" );
                }
    
        for( hWnd = GetWindow( hWnd, GW_CHILD ); hWnd;
             hWnd = GetWindow( hWnd, GW_HWNDNEXT ) ) {
    
            iLength = GetWindowTextLength( hWnd );
            Window_text = GetWindowText( hWnd, szBuffer, iLength );
    
            cout << "\n Childwindow[ " << i << " ]  -  " << *szBuffer;
            i++;
        }
        getchar();
        return 0;
    }
    

    doch jedes mal listet er mir nur "Y" auf statt, Butto01 ... wieso???

    [EDIT] Ok... wenn ich statt pointer nen array nehm gehts... hmm

    Gruß Tobi



  • Wenn du mit einem Pointer arbeitest und sogar schon die Länge in iLength ermittelst, dann musst du nur noch entsprechend Speicher reservieren (new, malloc) - und am Ende diesen wieder freigeben (delete[], free)



  • Ach komm ... machen wirs ordentlich 😉

    int main() 
    {
    	std::string window_name;
    	std::cout << "Please enter the Windowname: " << std::flush;
    	std::getline(std::cin, window_name);
    
    	HWND hWnd = FindWindow(NULL, window_name.c_str());
    
    	if (hWnd == NULL || IsWindow(hWnd) == FALSE)
    	{
    		std::cout << "ERROR! Could not find window!" << std::endl;
    		std::cin.clear();
    		std::cin.ignore(std::cin.rdbuf()->in_avail());
    		std::cin.get();	
    
    		return 1;
    	}
    
    	std::cout << "The window could be found!" << std::endl;
    
    	unsigned short child_windows = 0;
        for (hWnd = GetWindow(hWnd, GW_CHILD ); hWnd; hWnd = GetWindow(hWnd, GW_HWNDNEXT), ++child_windows) 
    	{
            int nLen	= GetWindowTextLength(hWnd);
    		char* szBuffer = new char[nLen];
            GetWindowText(hWnd, szBuffer, nLen);
    		std::cout << "\tChildwindow [" << child_windows << "]  ->  " << szBuffer << std::endl;
    		delete [] szBuffer;
        }
    
    	std::cin.clear();
    	std::cin.ignore(std::cin.rdbuf()->in_avail());
    	std::cin.get();	
    
    	return 0;
    }
    

  • Mod

    unsigned short child_windows = 0; 
        for (hWnd = GetWindow(hWnd, GW_CHILD ); hWnd; hWnd = GetWindow(hWnd, GW_HWNDNEXT), ++child_windows) 
        { 
            int nLen    = GetWindowTextLength(hWnd); 
            char* szBuffer = new char[nLen]; 
            GetWindowText(hWnd, szBuffer, nLen); 
            std::cout << "\tChildwindow [" << child_windows << "]  ->  " << szBuffer << std::endl; 
            delete [] szBuffer; 
        }
    

    Jedesmal ein alloc? Muss den wirklich so etwas sein?
    Vo rallem hast Du auch keinen Platz für das '\0' Zeichen reserviert.

    unsigned short child_windows = 0; 
        int nMaxLen = 1024;
        char* szBuffer = new char[nMaxLen];
        for (hWnd = GetWindow(hWnd, GW_CHILD ); hWnd; hWnd = GetWindow(hWnd, GW_HWNDNEXT), ++child_windows) 
        { 
            int nLen = GetWindowTextLength(hWnd)+1; 
            if (nLen>nMaxLen)
            {
                delete [] szBuffer;
                szBuffer = new char[nMaxLen=max(nMaxLen*2,nLen)];    
            }
            GetWindowText(hWnd, szBuffer, nLen); 
            std::cout << "\tChildwindow [" << child_windows << "]  ->  " << szBuffer << std::endl; 
        } 
        delete [] szBuffer;
    


  • Hmm stimmt war mir nicht sicher ob GetWindowTextLength jetzt den Terminator einbezieht ... naja ... hmm ok ist vllt so etwas performanter, allerdings hast du so selbst wenn es nur ein ganz kurzer String ist direkt 1024 reserviert ...



  • (D)Evil schrieb:

    hmm ok ist vllt so etwas performanter, allerdings hast du so selbst wenn es nur ein ganz kurzer String ist direkt 1024 reserviert ...

    Was ja immerhin 0,0001% der heutzutage üblichen 1 GB Hauptspeicher sind 🙂


Anmelden zum Antworten