wildcmp nutzen.



  • Die Links haben wir leider nicht wirklich weiter geholfen 😞



  • Ach ja, außerdem frage ich hier, weil ich keine Antwort per google fand, nicht weil ich zu dumm bin es selbst zu nutzen und eine andere Person bitte dies für mich zu tun.



  • Mir fehlen die Worte 😞
    Sind die Beispiele sooo schwierig?



  • Mir fehlen die Worte 😞

    Das ist schade, weil ich dadurch 3 Stunden meines Lebens für garnichts geopfert habe, ohne ein Schritt weiter zu sein, noch eine Lösung zu besitzen. Nur eine Linksammlung von Seiten die mir auch vor dem reinstellen meiner Frage, hier im Forum, nichts genutzt haben.



  • Pass mal auf, es geht doch darum, dass du die Funktion EnumWindows richtig anwendest (so, dass alle Fenster aufgezählt werden) und Jochens Links sollten dir dabei helfen, eben weil sie Codebeispiele beinhalten.
    Nehmen wir mal den Link http://www.c-plusplus.net/forum/viewtopic-var-t-is-211172.html (hab's etwas abgewandelt und kommentiert):

    #include <windows.h>
    
    // Der Parameter LPARAM lParam beinhaltet hier das, was wir bei EnumWindows als zweiten Parameter übergeben
    BOOL CALLBACK MyEnumProc(HWND hWnd, LPARAM lParam)
    {
        // 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
        GetWindowTet( hWnd, title, sizeof(title)/sizeof(title[0]) );
    
        // Und geben den Fenster-Titel mit einer MessageBox aus
        MessageBo( 0, title, 0, 0 );
    
        // "TRUE" zurückgeben, damit diese Callback-Funktion weiter aufgerufen wird
        return TRUE;
    }
    
    int main()
    {
        EnumWindows( MyEnmProc, 0 );
    }
    

    Zu guter Letzt sind jetzt ein paar Rechtschreibfehler drin, damit du den Code nicht einfach kopierst, sondern dich auch damit beschäftigst - sollte also zu schaffen sein, die Fehler zu finden 🙂



  • Sehr vielen Danke. Jetzt habe ich es verstanden.
    Dank an dich, Jochen Kalmbach. Dich habe ich wohl missverstanden.
    Fehlerfrei funktioniert der code aber leider nicht:

    in function BOOL MyEnumProc(HWND__*, LPARAM)': rror:titel' was not declared in this scope
    warning: unused variable 'titel'
    In member function void CStellwerk::MakeScreenshot(char*)': error:PrintWindow' was not declared in this scope
    warning: unused variable 'rRect'
    warning: unused variable 'PrintWindow'
    In member function `void CStellwerk::SaveScreen(HWND__, char)':
    unused variable 'iResult'
    Process terminated with status 1 (0 minutes, 0 seconds)
    2 errors, 4 warnings

    Die Variable titel habe ich extra global gestellt. Es hat nichts geholfen.
    PrintWindow müsste ind er windows.h drinn sein.
    Weiß wer Rat?

    #include <windows.h>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    TCHAR title[500];
    HWND m_hDesktop;
    HWND pScreen;
    HDC hdcScreen;
    HBITMAP hbmScreen;
    
    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 hWnd, 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*", titel)) {
        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);
    
    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;
    
          }
    


  • titel <-> title
    PrintWindow ist nicht in windows.h, guck mal in der MSDN, welche Header-Datei du brauchst. Und wieso benutzt du in der MyEnumWindows die Variable hWnd nicht? Dann brauchst du die Fenster auch nicht aufzuzählen, wenn du sie nicht brauchst.



  • 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? 👍


Anmelden zum Antworten