Callbackfunction



  • Tach allerseits!

    Ich will mit enumwindows alle Fenster auflisten.
    Leider hab ich den Dreh mit den Callbackfunctions noch nicht ganz raus (keine beschreibung)

    Wie muss ich das bewerkstelligen?

    Danke im Voraus!





  • Sowas?

    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
    
    BOOL CALLBACK MyEnumFunc(HWND hWnd, LPARAM lParam)
    {
      _tprintf(_T("hWnd: 0x%p, lParam: 0x%p\n"), hWnd, lParam);
      return TRUE;
    }
    
    int _tmain()
    {
      EnumWindows(MyEnumFunc, NULL);
    }
    


  • ich versteh zwar:eine Funktion ruft eine Callbackfunktion auf und diese läuft bis irgendwann FALSE zurückgegeben wird.
    Aber die Paramater?

    Wie/Wo werden jetzt die Titel/Handles temp. gespeichert?

    Mfg



  • GetWindowText(hWnd, ...);



  • julio schrieb:

    Wie/Wo werden jetzt die Titel/Handles temp. gespeichert?

    Die Handle werden nicht temporär gespeichert. Das kannst Du aber einfach mit einem std::vector Objekt, instantiiert mit dem Typ HWND, realisieren.

    Den Fenstertext ermittelt man dann immer üben den entsprechenden Handle des Fensters.



  • Hallo,
    thx, hab das mal so implementiert:

    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    #include "FMIFS.h"
    
    int i=-1;
    HWND Handle[100];
    char titel[200]="";
    char string[200];
    
    BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
    i=i+1;
    Handle[i]=hwnd;
    int c=GetWindowTextLength(hwnd);
    GetWindowText(hwnd,string,120);
    
    MessageBox(0,(LPCSTR)string,(LPCSTR)titel,0);
    
    return TRUE;
    }
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow) 
    
    {
    // Irgendwo im Code
    EnumWindows((WNDENUMPROC)EnumWindowsProc, 0);	
    
    return 0;
    }
    

    Blöderweise gibts IsVisible wohl nur für vb.
    Weiss jmd wie ich da überprüfen kann ob ein Fenster visible ist?

    Thx



  • Julio schrieb:

    Blöderweise gibts IsVisible wohl nur für vb.

    Probiere mal "IsWindowVisible ()". 🙂



  • :-), Thx!



  • #define WIN32_LEAN_AND_MEAN	
    #include <windows.h>
    #include <tchar.h>
    #include "FMIFS.h"
    
    BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM)
    {
    	int			nTextLen	= GetWindowTextLength(hWnd);
    	LPTSTR		lpString	= new TCHAR[nTextLen + 1];
    	GetWindowText(hWnd, lpString, nTextLen);
    	MessageBox(NULL, lpString, _T("Title"), MB_OK | MB_ICONINFORMATION);
    	delete [] lpString;
    
    	// Verarbeite den HWND sofort ... globale Variablen sind unschön ...
    
    	return TRUE;
    }
    
    int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    	EnumWindows(WNDENUMPROC(EnumWindowsProc), 0);   
    	return 0;
    }
    

    Guck dir den Kommentar an ...



  • Julio schrieb:

    (WNDENUMPROC)EnumWindowsProc
    

    (D)Evil schrieb:

    WNDENUMPROC(EnumWindowsProc)
    

    lol



  • proficaster
    Hast du schön zitiert ... nun will ich aber auch von dir den Unterschied der beiden Casts wissen 😉



  • Wenn die zweite Variante ("WNDENUMPROC(EnumWindowsProc)") geht, dann ist der "cast" redundant.



  • 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.


Anmelden zum Antworten