Screenshot in C++



  • Hallo!
    Ich habe hier ein Programm aus mehreren zusammengeschnitten. Es sollte ein Screenshot machen und als BMP speichern, aber es funktioniert nicht.. könnt ihr mir helfen?
    [/cpp]
    /*screen capture example*/
    #include <windows.h>
    #include <fstream>
    #include <stdio.h>
    #include <wingdi.h>
    #include <fstream.h>

    #define SCREENWIDTH GetSystemMetrics(SM_CXSCREEN)
    #define SCREENHEIGHT GetSystemMetrics(SM_CYSCREEN)

    HBITMAP g_hDeskBmp;
    HDC g_hMemDC;
    int g_nDCdata;

    int main()
    {
    /*capture desktop and store for later use*/
    HDC hdcDesk;
    hdcDesk=GetDC(HWND_DESKTOP); /*equivalent to hdcDesk=GetDC((HWND)0);*/
    g_hMemDC=CreateCompatibleDC(0);
    g_hDeskBmp=CreateCompatibleBitmap(hdcDesk, SCREENWIDTH, SCREENHEIGHT);
    /*fill the bitmap with contents of desktop*/
    g_nDCdata=SaveDC(g_hMemDC);
    SelectObject(g_hMemDC,g_hDeskBmp);
    BitBlt(g_hMemDC, 0, 0, SCREENWIDTH, SCREENHEIGHT,hdcDesk,0,0,SRCCOPY);

    //......................................................................................

    // create the BMP file

    // create output file
    ofstream bmpfile("d:\\filename.bmp");
    // save bitmap file header
    BITMAPFILEHEADER fileHeader;
    fileHeader.bfType = 0x4d42;
    fileHeader.bfSize = 0;
    fileHeader.bfReserved1 = 0;
    fileHeader.bfReserved2 = 0;
    fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

    if(!bmpfile.write((char*)&fileHeader, sizeof(fileHeader)))
    return 0;

    // save bitmap info header
    BITMAPINFOHEADER infoHeader;
    infoHeader.biSize = sizeof(infoHeader);
    infoHeader.biWidth = 800;
    infoHeader.biHeight = 600;
    infoHeader.biPlanes = 1;
    infoHeader.biBitCount = 32;
    infoHeader.biCompression = BI_RGB;
    infoHeader.biSizeImage = 0;
    infoHeader.biXPelsPerMeter = 0;
    infoHeader.biYPelsPerMeter = 0;
    infoHeader.biClrUsed = 0;
    infoHeader.biClrImportant = 0;

    if(!bmpfile.write((char*)&infoHeader, sizeof(infoHeader)))
    return 0;

    // save color table (sample used here is 8-bit grayscale)
    if(infoHeader.biBitCount == 😎 {
    RGBQUAD table[256];
    for(size_t i = 0; i < 256; i++)
    table[i].rgbRed = table[i].rgbGreen = table[i].rgbBlue = (BYTE)i;
    if(!bmpfile.write((char*)table, 256*sizeof(RGBQUAD)))
    return 0;
    }
    else if(infoHeader.biBitCount == 4) {
    // 16 colors
    }
    else if(infoHeader.biBitCount == 1) {
    // only two colors (doesn't necessarily have to be always black and white!)
    }

    // save bitmap data
    if(!bmpfile.write((char*)&hdcDesk, sizeof(hdcDesk)))
    return 0;

    ReleaseDC(HWND_DESKTOP,hdcDesk);
    RestoreDC(g_hMemDC,g_nDCdata);
    DeleteDC(g_hMemDC);
    DeleteObject(g_hDeskBmp);

    // close the file

    return 0;
    //......................................................................................
    }



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • // get desktop window (but can be any window)
     HWND capture = GetDesktopWindow();
     if(!IsWindow(capture)) return 1;
    
     // get window dimensions
     RECT rect;
     GetWindowRect(capture, &rect);
    
     size_t dx = rect.right - rect.left;
     size_t dy = rect.bottom - rect.top;
    
     // create BITMAPINFO structure
     // used by CreateDIBSection
     BITMAPINFO info;
     info.bmiHeader.biSize          = sizeof(BITMAPINFOHEADER);
     info.bmiHeader.biWidth         = dx;
     info.bmiHeader.biHeight        = dy;
     info.bmiHeader.biPlanes        = 1;
     info.bmiHeader.biBitCount      = 24;
     info.bmiHeader.biCompression   = BI_RGB;
     info.bmiHeader.biSizeImage     = 0;
     info.bmiHeader.biXPelsPerMeter = 0;
     info.bmiHeader.biYPelsPerMeter = 0;
     info.bmiHeader.biClrUsed       = 0;
     info.bmiHeader.biClrImportant  = 0;
    
     // a bitmap handle and a pointer its bit data
     HBITMAP bitmap = 0;
     BYTE*   memory = 0;
    
     // create bitmap
     HDC device = GetDC(capture);
     bitmap = CreateDIBSection(device, &info, DIB_RGB_COLORS, (void**)&memory, 0, 0);
     ReleaseDC(capture, device);
     if(!bitmap || !memory) return 1;
    
     // blit the contents of the desktop (winDC)
     // to the bitmap (selected in memDC)
     HDC winDC = GetWindowDC(capture);
     HDC memDC = CreateCompatibleDC(winDC);
     SelectObject(memDC, bitmap);
     BitBlt(memDC, 0, 0, dx, dy, winDC, 0, 0, SRCCOPY);
     DeleteDC(memDC);
     ReleaseDC(capture, winDC);
    
     char *buffer;
     sprintf(buffer,"capture%d%d.bmp",dx,dy);
     // create bitmap file
     basic_ofstream<char> file(buffer, ios::binary);
     if(!file) { DeleteObject(bitmap); return 1; }
    
     // initialize bitmap file headers
     BITMAPFILEHEADER fileHeader;
     BITMAPINFOHEADER infoHeader;
    
     fileHeader.bfType      = 0x4d42;
     fileHeader.bfSize      = 0;
     fileHeader.bfReserved1 = 0;
     fileHeader.bfReserved2 = 0;
     fileHeader.bfOffBits   = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    
     infoHeader.biSize          = sizeof(infoHeader);
     infoHeader.biWidth         = dx;
     infoHeader.biHeight        = dy;
     infoHeader.biPlanes        = 1;
     infoHeader.biBitCount      = 24;
     infoHeader.biCompression   = BI_RGB;
     infoHeader.biSizeImage     = 0;
     infoHeader.biXPelsPerMeter = 0;
     infoHeader.biYPelsPerMeter = 0;
     infoHeader.biClrUsed       = 0;
     infoHeader.biClrImportant  = 0;
    
     // save file headers
     file.write((char*)&fileHeader, sizeof(fileHeader));
     file.write((char*)&infoHeader, sizeof(infoHeader));
    
     // save 24-bit bitmap data
     int wbytes = (((24*dx + 31) & (~31))/8);
     int tbytes = (((24*dx + 31) & (~31))/8)*dy;
     file.write((char*)memory, tbytes);
    
     // delete bitmap
     DeleteObject(bitmap);
     bitmap = 0;
     memory = 0;
    


  • Danke für die Antwort, aber die folgenden Zeilen verursachen bei DevC++ einen Fehler:
    // create bitmap file
    basic_ofstream <char> file(buffer, ios::binary);
    if(!file) { DeleteObject(bitmap); return 1; }

    Woran kann das liegen?



  • Oh man warum verbreitest du so einen alten Scheiss?



  • Wenn Du einen richtigen Compiler willst, dann laden VC++ 2005 Express runter. Und das ganze auch noch ganz legal...
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-130812.html



  • @Amazeroth: using namespace std;



  • Jo, danke wegen dem using namespace std, aber das hab ich schon ausprobiert. Muss an was anderem liegen.. ich lade grade Visual C++ runter, wir ihrs mir empfohlen habt. Mal sehn obs dann funktioniert.

    Danke an alle für die Hilfe!



  • Hallo nochmal.. ich habe Visual C++ jetzt, aber ich habe absolut keine Ahnung welche header Dateien ich benötige um das Script zu kompilieren.. windows.h gibt es nicht, welche muss ich stattdessen benutzen? Dasselbe mit iostream.h, fstream.h und wingdi.h.. Danke schonmal



  • 1.) Platform SDK installieren und einrichten

    2.) Die Dateien heißen iostream und fstream.



  • char* buffer = "screenshot.bmp";
    

    dann hat bei mir alles geklappt

    @Amazeroth

    naja, ich glaube ich komme einpaar jahre zuspät
    letzter beitrag war der 25.02.2006 ,
    damals war ich 5 jahre alt 😮 😮 🙂





  • Ja, stimmt

    char* buffer
    

    war undefiniert.
    richtig wäre gewesen:

    char buffer [MAX_PATH];
    

    Ach wie schön doch ein alter Thread sein kann 😃


Log in to reply