Screenshot in C++



  • // 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 😃


Anmelden zum Antworten