wildcmp nutzen.



  • Header: Declared in Winuser.h; include Windows.h.

    Ich habe beide eingebunden, selbst die libary. Es geht nicht.

    MyEnumWindows die Variable hWnd nicht?

    Was meinst du? Ich finde nicht was du meinst.



  • wildcmp schrieb:

    Header: Declared in Winuser.h; include Windows.h.

    Ich habe beide eingebunden, selbst die libary. Es geht nicht.

    Oh richtig, guck mal in der Winuser.h, da steht ein paar Zeilen vor der PrintWindow-Funktion die Zeile #if(_WIN32_WINNT >= 0x0501) , du musst also vorher dieses Makro definieren (am Besten entsprechend deiner Windows-Version).

    wildcmp schrieb:

    MyEnumWindows die Variable hWnd nicht?

    Was meinst du? Ich finde nicht was du meinst.

    Guck mal in die Funktion MyEnumProc, die bekommt ein Fenster-HANDLE namens "hWnd" übergeben. Du benutzt dieses Handle aber nicht. Das Ding ist: Die einzige Funktionalität, die EnumWindows hat, ist, deine Funktion MyEnumProc nacheinander mit allen verfügbaren Fenster-Handles aufzurufen. Wenn du nicht die Fenster-Handles nicht benutzt, brauchst du sie anscheinend nicht -> dann brauchst du auch EnumWindows nicht.

    Um das klarzustellen: Du rufst die Funktion EnumWindows auf. Diese Funktion gehört zu Windows und hat intern eine Liste von allen Fenstern. Du übergibst der Funktion EnumWindows einen Funktionszeiger auf deine MyEnumProc-Funktion, d.h. dass die Windows-Funktion EnumWindows deine MyEnumProc-Funktion aufrufen kann. Und das tut sie auch, und zwar in einer Schleife; die EnumWindows-Funktion geht alle Fenster durch und ruft deine MyEnumProc-Funktion für jedes Fenster auf und übergibt ihr das Fenster-Handle (sowas wie eine ID). Capito?



  • main.cpp|92|error: `PrintWindow' was not declared in this scope|
    

    winuser.h:

    #if (_WIN32_WINNT >= 0x0501)
    WINUSERAPI BOOL WINAPI PrintWindow(HWND,HDC,UINT);
     #endif
    

    Wie kann ich diese Funktion nun nutzen? Da shabe ich nicht wirklich verstanden.



  • #define _WIN32_WINNT 0x0501
    #include <windows.h>
    

    Ist dir klar, was #include macht?



  • Sehr vielen Danke, Badestrand.

    Ein Problem bekomm ich nicht gelöst:

    main.cpp||In member function `void CStellwerk::MakeScreenshot(char*)':|
    main.cpp|93|error: cannot convert `TCHAR*' to `HWND__*' for argument `1' to `BOOL PrintWindow(HWND__*, HDC__*, UINT)'|
    main.cpp||In member function `void CStellwerk::SaveScreen(HWND__*, char*)':|
    main.cpp|189|warning: unused variable 'iResult'|
    ||=== Build finished: 1 errors, 1 warnings ===|
    

    Gibt es da ein Trick wie ich das machen kann? Also ein tchar zum hwnd zu konvertieren.

    #define _WIN32_WINNT 0x0501
    #include <windows.h>
    #include <Winuser.h>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    TCHAR title[500];
    // HWND m_hDesktop;
    HWND pScreen;
    HDC hdcScreen;
    HBITMAP hbmScreen;
    static BOOL CALLBACK MyEnumProc(HWND hWnd, LPARAM lParam);
    
    class CStellwerk{
    public:
    
        void MakeScreenshot(char SavePath[]);
        void SaveScreen(HWND pScreen, char Path[]);
        int wildcmp(const char *wild, const char *string);
    
    };
    
    int wildcmp(const char *wild, const char *string) {
      // Written by Jack Handy - jakkhandy@hotmail.com
    
      const char *cp = NULL, *mp = NULL;
    
      while ((*string) && (*wild != '*')) {
        if ((*wild != *string) && (*wild != '?')) {
          return 0;
        }
        wild++;
        string++;
      }
    
      while (*string) {
        if (*wild == '*') {
          if (!*++wild) {
            return 1;
          }
          mp = wild;
          cp = string+1;
        } else if ((*wild == *string) || (*wild == '?')) {
          wild++;
          string++;
        } else {
          wild = mp;
          string = cp++;
        }
      }
    
      while (*wild == '*') {
        wild++;
      }
      return !*wild;
    }
    
    // Der Parameter LPARAM lParam beinhaltet hier das, was wir bei EnumWindows als zweiten Parameter übergeben
    BOOL CALLBACK MyEnumProc(HWND m_hDesktop, LPARAM lParam)
    {
        // Ein Buffer für den Fenstertitel
    
        ZeroMemory( title, sizeof(title) );
    
        // Hier holen wir uns mittels des Handles den Fenster-Titel mit GetWindowText
        GetWindowText( m_hDesktop, title, sizeof(title)/sizeof(title[0]) );
    
        // Und geben den Fenster-Titel mit einer MessageBox aus
       // MessageBox( 0, title, 0, 0 );
    if (wildcmp("*Rechner*", title)) {
        return 0;
    }
    else {
        // "TRUE" zurückgeben, damit diese Callback-Funktion weiter aufgerufen wird
        return TRUE;
    }
    }
    
    void CStellwerk::MakeScreenshot(char SavePath[])
    {
    
        //  RECT rRect;
        // m_hDesktop =  GetDesktopWindow();
     // wildcmp("*Rech*", EnumWindows(m_hDesktop, NULL));
    
      // m_hDesktop = FindWindow(NULL, wildcmp("bl?h.*", "blah.jpg"));
     // MoveWindow(m_hDesktop,90,0,800,300,TRUE);
    EnumWindows( MyEnumProc, 0);
    // WINUSERAPI BOOL WINAPI PrintWindow(HWND,HDC,UINT);
    PrintWindow(title, hdcScreen, NULL);
    
    /*
    GetWindowRect(m_hDesktop,&rRect);
    cout << rRect.left   <<endl;
    cout << rRect.top    <<endl;
    cout << rRect.right  <<endl;
    cout << rRect.bottom <<endl;
    
         if(m_hDesktop == NULL)
         {
             cout<<"Testfenster wurde nicht gefunden!\n";
             exit(1);
         }
         SaveScreen(m_hDesktop,SavePath);
    }
    */
    }
    int main()
    {
    
        CStellwerk Stellwerk;
    
        Stellwerk.MakeScreenshot("C:\\screeni.bmp");
    
    }
    
    void CStellwerk::SaveScreen(HWND pScreen, char Path[])
    
          {
    
              HDC hdcScreen;
    
              HBITMAP hbmScreen;
    
              //---------------Bitmap Informationen
    
              BITMAPINFO infobmp;
    
              infobmp.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    
              infobmp.bmiHeader.biWidth = 1024;
    
              infobmp.bmiHeader.biHeight = 768;
    
              infobmp.bmiHeader.biPlanes = 1;
    
              infobmp.bmiHeader.biBitCount = 24;
    
              infobmp.bmiHeader.biCompression = 0;
    
              infobmp.bmiHeader.biSizeImage = 0;
    
              infobmp.bmiHeader.biXPelsPerMeter = 0;
    
              infobmp.bmiHeader.biYPelsPerMeter = 0;
    
              infobmp.bmiHeader.biClrUsed = 0;
    
              infobmp.bmiHeader.biClrImportant = 0;
    
              int* bitmap = new int[1024*768*3];
    
              BITMAPFILEHEADER bfheader;
    
              bfheader.bfType = 19778;
    
              bfheader.bfSize = sizeof(BITMAPFILEHEADER) + 1024*768*3 + sizeof(BITMAPINFOHEADER);
    
              bfheader.bfReserved1 = 0;
    
              bfheader.bfReserved2 = 0;
    
              bfheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    
              //Bitmap -----------------------      Informationen
    
              hdcScreen = GetWindowDC(pScreen);
    
              hbmScreen = CreateCompatibleBitmap(hdcScreen,1024,768);
    
              // temporärer DC
    
              HDC hdcTemp = CreateCompatibleDC( hdcScreen );
    
              // Bitmap reinselektieren
    
              HBITMAP hbmOld = (HBITMAP)SelectObject( hdcTemp, hbmScreen );
    
              // Inhalt von Desktop übertragen
    
              BitBlt( hdcTemp, 0, 0, 1024, 768, hdcScreen, 0, 0, SRCCOPY );
    
              int iResult = GetDIBits(hdcTemp,hbmScreen,0,768,bitmap,&infobmp,DIB_RGB_COLORS);
    
              // aufräumen
    
              SelectObject( hdcTemp, hbmOld );
    
              DeleteObject( hbmScreen );
    
              DeleteDC( hdcTemp );
              HANDLE hfile = CreateFile( Path,GENERIC_WRITE,0,0,OPEN_ALWAYS,0,0);
    
              //Datei Schreiben
    
              DWORD word;
            WriteFile(hfile,&bfheader,14,&word,NULL);
    
              WriteFile(hfile,&infobmp,40,&word,NULL);
    
              WriteFile(hfile,bitmap,1024*768*3,&word,NULL);
    
              ReleaseDC(pScreen,hdcScreen);
    
              CloseHandle(hfile);
    
              delete[] bitmap;
    
          }
    


  • wildcmp schrieb:

    Sehr vielen Danke, Badestrand.

    Aber gerne doch.

    wildcmp schrieb:

    Gibt es da ein Trick wie ich das machen kann? Also ein tchar zum hwnd zu konvertieren.

    Klar, mit Gewalt (reinterpret_cast), ist aber ähnlich sinnvoll wie aus Kirschen ein Haus zu bauen. Die Funktion erwartet ein Fenster-Handle, gib ihr doch einfach eins.. Fenster werden übrigens eindeutig durch ihr Handle und nicht durch ihren Titel identifiziert.



  • EnumWindows sucht mit der Callback funktion MyEnumProc mit dem handle aller Fenster nach dem Wort "Fire" in den Fenstertitel. Gesucht wird mit wildcmp().
    Sobald es ein Treffer gibt, wird die funktion MakeScreenshot() aufgerufen, die wiederum SaveScreen() aufruft. Nun müsste man eigentlich unter C: die Datei screeni.bmp mit einem Screenshot des Firefox-Windows finden. Tut man leider nicht.
    Den Fehler kenne ich nicht, finde ich auch nicht. Hoffentlich einer von euch.

    #define _WIN32_WINNT 0x0501
    #include <windows.h>
    #include <Winuser.h>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    TCHAR title[500];
    HWND m_hDesktop;
    HWND pScreen;
    HDC hdcScreen;
    HBITMAP hbmScreen;
    static BOOL CALLBACK MyEnumProc(HWND hWnd, LPARAM lParam);
    void MakeScreenshot(char SavePath[]);
    void SaveScreen(HWND pScreen, char Path[]);
    int wildcmp(const char *wild, const char *string);
    
    int main()
    {
    
        EnumWindows( MyEnumProc, 0);
        MakeScreenshot("C:\\screeni.bmp");
        return 0;
    }
    
    //////////////////////////////////////////////////////////////
    void SaveScreen(HWND m_hDesktop, char Path[])
    {
    
              HDC hdcScreen;
    
              HBITMAP hbmScreen;
    
              //---------------Bitmap Informationen
    
              BITMAPINFO infobmp;
    
              infobmp.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    
              infobmp.bmiHeader.biWidth = 1024;
    
              infobmp.bmiHeader.biHeight = 768;
    
              infobmp.bmiHeader.biPlanes = 1;
    
              infobmp.bmiHeader.biBitCount = 24;
    
              infobmp.bmiHeader.biCompression = 0;
    
              infobmp.bmiHeader.biSizeImage = 0;
    
              infobmp.bmiHeader.biXPelsPerMeter = 0;
    
              infobmp.bmiHeader.biYPelsPerMeter = 0;
    
              infobmp.bmiHeader.biClrUsed = 0;
    
              infobmp.bmiHeader.biClrImportant = 0;
    
              int* bitmap = new int[1024*768*3];
    
              BITMAPFILEHEADER bfheader;
    
              bfheader.bfType = 19778;
    
              bfheader.bfSize = sizeof(BITMAPFILEHEADER) + 1024*768*3 + sizeof(BITMAPINFOHEADER);
    
              bfheader.bfReserved1 = 0;
    
              bfheader.bfReserved2 = 0;
    
              bfheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    
              //Bitmap -----------------------      Informationen
    
              hdcScreen = GetWindowDC(m_hDesktop);
    
              hbmScreen = CreateCompatibleBitmap(hdcScreen,1024,768);
    
              // temporärer DC
    
              HDC hdcTemp = CreateCompatibleDC( hdcScreen );
    
              // Bitmap reinselektieren
    
              HBITMAP hbmOld = (HBITMAP)SelectObject( hdcTemp, hbmScreen );
    
              // Inhalt von Desktop übertragen
    
              BitBlt( hdcTemp, 0, 0, 1024, 768, hdcScreen, 0, 0, SRCCOPY );
    
              int iResult = GetDIBits(hdcTemp,hbmScreen,0,768,bitmap,&infobmp,DIB_RGB_COLORS);
    
              // aufräumen
    
              SelectObject( hdcTemp, hbmOld );
    
              DeleteObject( hbmScreen );
    
              DeleteDC( hdcTemp );
              HANDLE hfile = CreateFile( Path,GENERIC_WRITE,0,0,OPEN_ALWAYS,0,0);
    
              //Datei Schreiben
    
              DWORD word;
            WriteFile(hfile,&bfheader,14,&word,NULL);
    
              WriteFile(hfile,&infobmp,40,&word,NULL);
    
              WriteFile(hfile,bitmap,1024*768*3,&word,NULL);
    
              ReleaseDC(pScreen,hdcScreen);
    
              CloseHandle(hfile);
    
              delete[] bitmap;
    
          }
    // Der Parameter LPARAM lParam beinhaltet hier das, was wir bei EnumWindows als zweiten Parameter übergeben
    BOOL CALLBACK MyEnumProc(HWND m_hDesktop, LPARAM lParam)
    {
        // Ein Buffer für den Fenstertitel
    
        ZeroMemory( title, sizeof(title) );
    
        // Hier holen wir uns mittels des Handles den Fenster-Titel mit GetWindowText
        GetWindowText( m_hDesktop, title, sizeof(title)/sizeof(title[0]) );
    
        // Und geben den Fenster-Titel mit einer MessageBox aus
        cout << title << endl;
      //  MessageBox( 0, title, 0, 0 );
    if (wildcmp("*Firef*", title)) {
        cout << "treffer!!" << endl;
        MakeScreenshot("C:\\screeni.bmp");
        return 0;
    }
    else {
        // "TRUE" zurückgeben, damit diese Callback-Funktion weiter aufgerufen wird
        return TRUE;
    }
    }
    
    void MakeScreenshot(char SavePath[])
    {
    
        //  RECT rRect;
        // m_hDesktop =  GetDesktopWindow();
     // wildcmp("*Rech*", EnumWindows(m_hDesktop, NULL));
    
      // m_hDesktop = FindWindow(NULL, wildcmp("bl?h.*", "blah.jpg"));
     // MoveWindow(m_hDesktop,90,0,800,300,TRUE);
    
    // WINUSERAPI BOOL WINAPI PrintWindow(HWND,HDC,UINT);
    PrintWindow(m_hDesktop, hdcScreen, NULL);
    
    /*
    GetWindowRect(m_hDesktop,&rRect);
    cout << rRect.left   <<endl;
    cout << rRect.top    <<endl;
    cout << rRect.right  <<endl;
    cout << rRect.bottom <<endl;
    
         if(m_hDesktop == NULL)
         {
             cout<<"Testfenster wurde nicht gefunden!\n";
             exit(1);
         }
         SaveScreen(m_hDesktop,SavePath);
    }
    */
    }
    
    int wildcmp(const char *wild, const char *string) {
      // Written by Jack Handy - jakkhandy@hotmail.com
    
      const char *cp = NULL, *mp = NULL;
    
      while ((*string) && (*wild != '*')) {
        if ((*wild != *string) && (*wild != '?')) {
          return 0;
        }
        wild++;
        string++;
      }
    
      while (*string) {
        if (*wild == '*') {
          if (!*++wild) {
            return 1;
          }
          mp = wild;
          cp = string+1;
        } else if ((*wild == *string) || (*wild == '?')) {
          wild++;
          string++;
        } else {
          wild = mp;
          string = cp++;
        }
      }
    
      while (*wild == '*') {
        wild++;
      }
      return !*wild;
    }
    


  • Nichts für ungut, aber dir scheint es noch stark an Grundlagen zu fehlen. Vielleicht solltest du erst nochmal ein Tutorial durcharbeiten und dich erst ohne die WinAPI versuchen. Wie gesagt, das sieht alles sehr konfus aus.



  • Wenn du's dennoch weiter versuchen willst, hier noch eine kleine Hilfe:

    #define _WIN32_WINNT 0x0501
    #include <windows.h>
    #include <iostream>
    
    // "wildcmp" wie gehabt, aber bitte true und false zurückgeben.
    bool wildcmp(const char *wild, const char *string);
    
    // Muss noch verbessert werden, funktioniert evtl aber erstmal (hab's nicht getestet).
    bool SaveAsBitmap( HWND wnd, const char* path );
    
    // Der Parameter LPARAM lParam beinhaltet hier das, was wir bei EnumWindows als zweiten Parameter übergeben
    BOOL CALLBACK MyEnumProc( HWND wnd, LPARAM par )
    {
        // Ein Buffer für den Fenstertitel
        TCHAR title[500];
        ZeroMemory( title, sizeof(title) );
    
        // Hier holen wir uns mittels des Handles den Fenster-Titel mit GetWindowText
        if ( GetWindowText( wnd, title, sizeof(title)/sizeof(title[0]) ) == 0 )
            return TRUE;
    
        if ( wildcmp("*Firef*", title) )
        {
            HANDLE* h = reinterpret_cast<HANDLE*>( par );
            *h = wnd;
            return FALSE;
        }
    
        // "TRUE" zurückgeben, damit diese Callback-Funktion weiter aufgerufen wird
        return TRUE;
    }
    
    int main()
    {
        // Fenster, dessen Inhalt gespeichert werden soll
        HANDLE wnd = NULL;
    
        // Das Fenster raussuchen lassen
        if ( ! EnumWindows( MyEnumProc, reinterpret_cast<LPARAM>(&wnd) ) )
        {
            std::cout << "EnumWindows ist fehlgeschlagen: " << GetLastError() << std::endl;
            return 0;
        }
    
        if ( wnd == NULL )
        {
            std::cout << "Fenster nicht gefunden!" << std::endl;
            return 0;
        }
    
        // ..als Bitmap speichern
        SaveAsBitmap( wnd, "C:\\screeni.bmp" );
    }
    


  • Jochen Kalmbach schrieb:

    Erster Treffer in google:
    http://www.experts-exchange.com/Programming/Programming_Languages/Cplusplus_Builder/Q_21733408.html

    und gleichzeitig auch der unbrauchbarste.
    🙂



  • Dank dir, Badestrand, oh Menschenfreund.

    Bis jetzt läuft alles dank deines codes prächtig.
    Doch leider sind alle abgespeicherten bilder nur schwarz.

    #define _WIN32_WINNT 0x0501
    #include <windows.h>
    #include <iostream>
    
    using namespace std;
    
    HWND wnd;
    
    // "wildcmp" wie gehabt, aber bitte true und false zurückgeben.
    bool wildcmp(const char *wild, const char *string);
    
    // Muss noch verbessert werden, funktioniert evtl aber erstmal (hab's nicht getestet).
    bool SaveAsBitmap( HWND wnd, const char *path );
    
    // Der Parameter LPARAM lParam beinhaltet hier das, was wir bei EnumWindows als zweiten Parameter übergeben
    BOOL CALLBACK MyEnumProc( HWND wnd, LPARAM par )
    {
        // Ein Buffer für den Fenstertitel
        TCHAR title[500];
        ZeroMemory( title, sizeof(title) );
    
        // Hier holen wir uns mittels des Handles den Fenster-Titel mit GetWindowText
        if ( GetWindowText( wnd, title, sizeof(title)/sizeof(title[0]) ) == 0 )
            return TRUE;
    
        if ( wildcmp("Eimer", title) )
        {
            HANDLE* h = reinterpret_cast<HANDLE*>( par );
            *h = wnd;
            return FALSE;
        }
        cout << title <<endl;
        // "TRUE" zurückgeben, damit diese Callback-Funktion weiter aufgerufen wird
        return TRUE;
    }
    
    int main()
    {
        // Fenster, dessen Inhalt gespeichert werden soll
     // HANDLE wnd = NULL;
    
        // Das Fenster raussuchen lassen
        if (EnumWindows( MyEnumProc, reinterpret_cast<LPARAM>(&wnd) ) )
        {
            std::cout << "EnumWindows ist fehlgeschlagen: " << GetLastError() << std::endl;
            return 0;
        }
    
        if ( wnd == NULL )
        {
            std::cout << "Fenster nicht gefunden!" << std::endl;
            return 0;
        }
    
        // ..als Bitmap speichern
        if(!SaveAsBitmap( wnd, "C:\\bildsch.bmp" )) {
            cout << "Abspeichern fehlgeschlagen" <<endl;
        }
    }
    
    bool SaveAsBitmap( HWND wnd, const char *path )
    {
        HDC hdcScreen;
        HBITMAP hbmScreen;
    
        //---------------Bitmap Informationen
        BITMAPINFO infobmp;
    
        infobmp.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        infobmp.bmiHeader.biWidth = 1024;
        infobmp.bmiHeader.biHeight = 768;
        infobmp.bmiHeader.biPlanes = 1;
        infobmp.bmiHeader.biBitCount = 24;
        infobmp.bmiHeader.biCompression = 0;
        infobmp.bmiHeader.biSizeImage = 0;
        infobmp.bmiHeader.biXPelsPerMeter = 0;
        infobmp.bmiHeader.biYPelsPerMeter = 0;
        infobmp.bmiHeader.biClrUsed = 0;
        infobmp.bmiHeader.biClrImportant = 0;
    
        int* bitmap = new int[1024*768*3];
    
        BITMAPFILEHEADER bfheader;
    
        bfheader.bfType = 19778;
        bfheader.bfSize = sizeof(BITMAPFILEHEADER)
                          + 1024*768*3 + sizeof(BITMAPINFOHEADER);
        bfheader.bfReserved1 = 0;
        bfheader.bfReserved2 = 0;
        bfheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    
        //Bitmap Informationen
        hdcScreen = GetWindowDC(wnd);
        hbmScreen = CreateCompatibleBitmap(hdcScreen,1024,768);
    
        // temporärer DC
        HDC hdcTemp = CreateCompatibleDC( hdcScreen );
    
        // Bitmap reinselektieren
        HBITMAP hbmOld = (HBITMAP)SelectObject( hdcTemp, hbmScreen );
    
        // Inhalt von
        BitBlt( hdcTemp, 0, 0, 1024, 768, hdcScreen, 0, 0, SRCCOPY );
        GetDIBits(hdcTemp,hbmScreen,0,768,bitmap,&infobmp,DIB_RGB_COLORS);
    
        // aufräumen
        SelectObject( hdcTemp, hbmOld );
        DeleteObject( hbmScreen );
        DeleteDC( hdcTemp );
        HANDLE hfile = CreateFile(path,GENERIC_WRITE,0,0,OPEN_ALWAYS,0,0);
    
        //Datei Schreiben
        DWORD word;
        WriteFile(hfile,&bfheader,14,&word,NULL);
        WriteFile(hfile,&infobmp,40,&word,NULL);
        WriteFile(hfile,bitmap,1024*768*3,&word,NULL);
        ReleaseDC(wnd,hdcScreen);
        CloseHandle(hfile);
    
        delete[] bitmap;
    }
    
    bool wildcmp(const char *wild, const char *string) {
      // Written by Jack Handy - jakkhandy@hotmail.com
    
      const char *cp = NULL, *mp = NULL;
    
      while ((*string) && (*wild != '*')) {
        if ((*wild != *string) && (*wild != '?')) {
          return 0;
        }
        wild++;
        string++;
      }
    
      while (*string) {
        if (*wild == '*') {
          if (!*++wild) {
            return 1;
          }
          mp = wild;
          cp = string+1;
        } else if ((*wild == *string) || (*wild == '?')) {
          wild++;
          string++;
        } else {
          wild = mp;
          string = cp++;
        }
      }
    
      while (*wild == '*') {
        wild++;
      }
      return !*wild;
    }
    


  • wildcmp schrieb:

    Bis jetzt läuft alles dank deines codes prächtig.
    Doch leider sind alle abgespeicherten bilder nur schwarz.

    Mensch Badestrand! Was hast Du denn da wieder gemacht?



  • Mensch Badestrand! Was hast Du denn da wieder gemacht?

    Mein code optimiert, was ja nicht verwerflich ist, oder? 👍



  • Jochen Kalmbach schrieb:

    Mensch Badestrand! Was hast Du denn da wieder gemacht?

    In die Hölle mit mir 🙂

    edit: @wildcmp: Ich denke da war Ironie im Spiel..



  • Warum hast du eigentlich die Variable HWND wnd aus der main-Funktion global gemacht? Und such doch mal bei Google, ob du nicht eine andere/funktionierende DC-nach-Bitmap Funktion findest.



  • `wnd' was not declared in this scope

    Daher global.

    DC-nach-Bitmap

    Naja, die chancen stehen wohl eher schlecht noch eine funktion inder msdn zu finden 😞

    So weit hast du mich schon gebracht. Schade, dass es doch nicht klappt. Dennoch vielen dank.



  • wildcmp schrieb:

    `wnd' was not declared in this scope

    In welcher Funktion kommt die Meldung denn? Sowohl in main, als auch in MyEnumProc und SaveAsBitmap sollte die Variable doch bekannt sein?

    wildcmp schrieb:

    Naja, die chancen stehen wohl eher schlecht noch eine funktion inder msdn zu finden 😞

    Ach, wer wird denn gleich aufgeben? 😉 Such mal bei Google nach "device context to bitmap c++" oder "winapi save dc to file" oder so (aber ohne Anführungsstriche).
    Vielleicht schreib ich auch noch was zusammen, oder die Forum-Suche könnte helfen 🙂



  • Danke für dein Mut, Badestrand.

    Zwar habe ich ein paar funktionen gefunden, doch ist anzumerken, dass ich die meisten nicht verstehe :D. Naja, 2 varianten:

    void  SaveBitmap(char *szFilename,HBITMAP hBitmap)
    
    {
    
          HDC        hdc=NULL;
    
          FILE*      fp=NULL;
    
          LPVOID     pBuf=NULL;
    
          BITMAPINFO bmpInfo;
    
          BITMAPFILEHEADER  bmpFileHeader; 
    
          do{ 
    
                hdc=GetDC(NULL);
    
                ZeroMemory(&bmpInfo,sizeof(BITMAPINFO));
    
                bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    
                GetDIBits(hdc,hBitmap,0,0,NULL,&bmpInfo,DIB_RGB_COLORS); 
    
                if(bmpInfo.bmiHeader.biSizeImage<=0)
    
                bmpInfo.bmiHeader.biSizeImage=bmpInfo.bmiHeader.biWidth*abs(bmpInfo.bmiHeader.biHeight)*(bmpInfo.bmiHeader.biBitCount+7)/8;
    
                if((pBuf = malloc(bmpInfo.bmiHeader.biSizeImage))==NULL)
    
                {
    
                      MessageBox( NULL, "Unable to Allocate Bitmap Memory", "Error", MB_OK|MB_ICONERROR);
    
                      break;
    
                }           
    
                bmpInfo.bmiHeader.biCompression=BI_RGB;
    
                GetDIBits(hdc,hBitmap,0,bmpInfo.bmiHeader.biHeight,pBuf, &bmpInfo, DIB_RGB_COLORS);       
    
                if((fp = fopen(szFilename,"wb"))==NULL)
    
                {
    
                      MessageBox( NULL, "Unable to Create Bitmap File", "Error", MB_OK|MB_ICONERROR);
    
                      break;
    
                } 
    
                bmpFileHeader.bfReserved1=0;
    
                bmpFileHeader.bfReserved2=0;
    
                bmpFileHeader.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmpInfo.bmiHeader.biSizeImage;
    
                bmpFileHeader.bfType='MB';
    
                bmpFileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); 
    
                fwrite(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);
    
                fwrite(&bmpInfo.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);
    
                fwrite(pBuf,bmpInfo.bmiHeader.biSizeImage,1,fp); 
    
          }while(false); 
    
                if(hdc)     ReleaseDC(NULL,hdc); 
    
                if(pBuf)    free(pBuf); 
    
                if(fp)      fclose(fp);
    
    }
    
    BOOL WriteDIB(LPCTSTR szFileName, LPBITMAPINFO pBm, LPVOID pBits)
    {
      HFILE hFile = CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    
      // make sure pBm->bmiHeader.biSizeImage is computed
      int ls = (pBm->bmiHeader.biWidth + 3) & (~3);
      pBm->bmiHeader.biSizeImage = ls * pBm->bmiHeader.biHeight * pBm->bmiHeader.biBitCount / 8;
    
      // if we are writing a 8 bit bitmap we must remember of the palette
      // - 256 RGBQUAD that are stored after pBm->bmiHeader. We are not handling
      // them in this code
      BITMAPFILEHEADER hdr;
      hdr.bfType		= ((WORD) ('M' << 8) | 'B');	// is always "BM"
      hdr.bfSize		= sizeof(hdr) + sizeof(BITMAPINFOHEADER);
      hdr.bfReserved1 	= 0;
      hdr.bfReserved2 	= 0;
      hdr.bfOffBits		= hdr.bfSize;
    
      DWORD dwByteCount;
      WriteFile(hFile, &hdr, sizeof(hdr), &dwByteCount, NULL);
      WriteFile(hFile, pBm, pBm->bmiheader.biSize, &dwByteCount, NULL);
      WriteFile(hFile, pBits, pBm->bmiheader.biSizeImage, &dwByteCount, NULL);
    
      CloseHandle(hFile);
      return TRUE;
    }
    


  • Ich habe gerade versucht beide funktionen zu probieren.
    Es war mehr schlecht als recht. Mein Versuch war eher lächerlich 😞



  • Badestrand,
    ich habe zwar nun ein bild (immerhin) nur willkürliche teile vom desktop.
    Da scheint etwas nur nicht zu passen und nicht komplett falsch zu sein.


Anmelden zum Antworten