Callbackfunction



  • der cast ist einfach unnötig wenn die funktion die richtig signatur hat. 😃



  • proficaster schrieb:

    der cast ist einfach unnötig wenn die funktion die richtig signatur hat. 😃

    Eben!

    @Julio:
    Also ich find die Version am besten, da man sich auch die globalen Variablen spart und alles in einem Packet hat 😉 :

    // #define UNICODE
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    
    #include <iostream>
    #include <vector>
    
    #if (defined UNICODE) || (defined _UNICODE)
      #define cOut std::wcout
    #else
      #define cOut std::cout
    #endif // UNICODE || _UNICODE
    
    BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
    {
        std::vector<HWND>* pWindows = reinterpret_cast<std::vector<HWND>*>(lParam);
        pWindows->push_back(hWnd);
        return (TRUE);
    }
    
    int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
        std::vector<HWND> vecWindows;
        EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(&vecWindows));
    
        cOut << TEXT("  Fenster-Handle:") << TEXT("\t") << TEXT("Fenstertitel:\n");
        for(int i = 0; i < 80 && cOut.put(TEXT('-')); i++)
            ;
        cOut << TEXT("\n");
    
        PTCHAR pszBuffer;
        long   lLength;
        for(int i = 0; i < vecWindows.size(); i++)
        {
            lLength = SendMessage(vecWindows[i], WM_GETTEXTLENGTH, 0, 0L) + 1L;
            pszBuffer = new TCHAR[lLength];
            SendMessage(vecWindows[i], WM_GETTEXT, lLength, reinterpret_cast<LPARAM>(pszBuffer));
            cOut << TEXT("   ") << std::hex << std::uppercase << TEXT("0x") << reinterpret_cast<long>(vecWindows[i]) << TEXT("\t\t") << pszBuffer << TEXT("\n");
            delete [] pszBuffer;
        }
    
    	cOut << TEXT("\n\n\n");
    
        return (0);
    }
    


  • CodeFinder schrieb:

    ...und alles in einem Packet hat 😉 :

    das paket ist aber möglicherweise schon veraltet, wenn du's verarbeiten willst.
    seit wann geht 'cout' in einem nicht-console programm?



  • ten schrieb:

    seit wann geht 'cout' in einem nicht-console programm?

    Gar nicht 😃 . Hab das wichtigste vergessen:

    // #define UNICODE
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    
    #include <iostream>
    #include <vector>
    
    #if (defined UNICODE) || (defined _UNICODE)
      #define cOut std::wcout
    #else
      #define cOut std::cout
    #endif // UNICODE || _UNICODE
    
    BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
    {
        std::vector<HWND>* pWindows = reinterpret_cast<std::vector<HWND>*>(lParam);
        pWindows->push_back(hWnd);
        return (TRUE);
    }
    
    int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
        std::vector<HWND> vecWindows;
        EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(&vecWindows));
    
        cOut << TEXT("  Fenster-Handle:") << TEXT("\t") << TEXT("Fenstertitel:\n");
        for(int i = 0; i < 80 && cOut.put(TEXT('-')); i++)
            ;
        cOut << TEXT("\n");
    
        PTCHAR pszBuffer;
        long   lLength;
        for(int i = 0; i < vecWindows.size(); i++)
        {
            lLength = SendMessage(vecWindows[i], WM_GETTEXTLENGTH, 0, 0L) + 1L;
            pszBuffer = new TCHAR[lLength];
            SendMessage(vecWindows[i], WM_GETTEXT, lLength, reinterpret_cast<LPARAM>(pszBuffer));
            cOut << TEXT("   ") << std::hex << std::uppercase << TEXT("0x") << reinterpret_cast<long>(vecWindows[i]) << TEXT("\t\t") << pszBuffer << TEXT("\n");
            delete [] pszBuffer;
        }
    
    	cOut << TEXT("\n\n\n");
    
        return (0);
    }
    
    int main()
    {
    	return (WinMain(GetModuleHandle(NULL), NULL, NULL, 0));
    }
    


  • ten schrieb:

    CodeFinder schrieb:

    ...und alles in einem Packet hat 😉 :

    das paket ist aber möglicherweise schon veraltet, wenn du's verarbeiten willst.

    Dann erweiter das Packet doch 😉 .



  • CodeFinder schrieb:

    ten schrieb:

    seit wann geht 'cout' in einem nicht-console programm?

    Gar nicht 😃 . Hab das wichtigste vergessen:

    das macht's aber auch nicht besser 🙄
    lass das 'winmain' ganz wech...

    CodeFinder schrieb:

    Dann erweiter das Packet doch 😉 .

    das geht nicht so einfach.
    besser alles in der 'enumproc' direkt machen, ohne den vector



  • ten schrieb:

    CodeFinder schrieb:

    ten schrieb:

    seit wann geht 'cout' in einem nicht-console programm?

    Gar nicht 😃 . Hab das wichtigste vergessen:

    das macht's aber auch nicht besser 🙄
    lass das 'winmain' ganz wech...

    Naja Ich hab einfach nur (D)Evil's ( ➡ Win32-GUI) Code kopiert und ne alte Testanwendung ( ➡ Konsole) aufgemacht^^. Sonst würde ich das natürlich trennen^^. War also situationsbedingt.

    ten schrieb:

    CodeFinder schrieb:

    Dann erweiter das Packet doch 😉 .

    das geht nicht so einfach.

    Klar, einfach den std::vector mit ner Struktur instantiieren. Da packste dann weitere Infos des Fensters rein (Zeichenketten sinnvollerweise mit std::string/std::wstring, damit spart man sich ne Menge).

    ten schrieb:

    besser alles in der 'enumproc' direkt machen, ohne den vector

    Nicht, wenn man die Infos später noch braucht.



  • CodeFinder schrieb:

    ten schrieb:

    besser alles in der 'enumproc' direkt machen, ohne den vector

    Nicht, wenn man die Infos später noch braucht.

    das ist doch nur ein snapshot. je später, desto wertloser wird er.
    manche fenster existieren längst nicht mehr, andere sind dazugekommen, deshalb: möglichst direkt alles in die 'enumproc' packen...



  • ten schrieb:

    CodeFinder schrieb:

    ten schrieb:

    besser alles in der 'enumproc' direkt machen, ohne den vector

    Nicht, wenn man die Infos später noch braucht.

    das ist doch nur ein snapshot. je später, desto wertloser wird er.
    manche fenster existieren längst nicht mehr, andere sind dazugekommen, deshalb: möglichst direkt alles in die 'enumproc' packen...

    Eben und falls man die Infos DOCH NOCH LÄNGER BRAUCHT, kann man ja immer noch mit IsWindow prüfen, obs noch existiert und dann ggf. aus dem Objekt löschen.



  • CodeFinder schrieb:

    Eben und falls man die Infos DOCH NOCH LÄNGER BRAUCHT, kann man ja immer noch mit IsWindow prüfen, obs noch existiert und dann ggf. aus dem Objekt löschen.

    naja, ich würde ja in dem fall lieber 'EnumWindows' neu starten 😉



  • Hm joar auch ne Möglichkeit...aber naja, wir haken hier auf nem unwichtigen Thema rum^^, wie ich finde 🤡 .



  • CodeFinder schrieb:

    wir haken hier auf nem unwichtigen Thema rum^^, wie ich finde 🤡 .

    da hast du natürlich recht.
    dein code war nur etwas fragwürdig, deshalb mein gemotze 😉
    aber der OP weiss jetzt sicher wie callbacks funzen...



  • Leute, die Daten die man von EnumWindows bekommt sind IMMER veraltet, ganz egal ob man die erst in einen Vektor steckt oder gleich im Callback verarbeitet.

    Also was jetzt?


Anmelden zum Antworten