Screenshot Programm läuft nicht.



  • Hallo,
    ich habe zwar danach gegoolet, aber was wirklich brauchbares nicht gefunden 😞
    Hoffentlich weiß wer, welche lib fehlt.

    #include <iostream>
    #include <windows.h>
    #include <fstream>
    #include <stdio.h>
    #include <wingdi.h>
    #include <fstream.h>
    
    #define SCREENWIDTH GetSystemMetrics(SM_CXSCREEN)
    #define SCREENHEIGHT GetSystemMetrics(SM_CYSCREEN)
    
    using namespace std;
    
    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);
    
    //......................................................................................
    
    // 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;
    
    ReleaseDC(HWND_DESKTOP,hdcDesk);
    RestoreDC(g_hMemDC,g_nDCdata);
    DeleteDC(g_hMemDC);
    DeleteObject(g_hDeskBmp);
    
    // close the file
    
    return 0;
    //......................................................................................
    }
    
    undefined reference to `CreateCompatibleDC@4'
    undefined reference to `CreateCompatibleBitmap@12'
    undefined reference to `SaveDC@4'
    undefined reference to `SelectObject@8'
    ndefined reference to `BitBlt@36'
    undefined reference to `CreateDIBSection@24'
    undefined reference to `CreateCompatibleDC@4'
    undefined reference to `SelectObject@8'
    undefined reference to `BitBlt@36'
    undefined reference to `DeleteDC@4'
    undefined reference to `DeleteObject@4'
    undefined reference to `DeleteObject@4'
    undefined reference to `RestoreDC@8'
    undefined reference to `DeleteDC@4'
    undefined reference to `DeleteObject@4'
    


  • #pragma comment(lib, "gdi32.lib")
    

    sowas steht in der MSDN man 👎



  • Ich habs mal einbisschen geändert, aber es läuft dennoch nicht, egal was ich hinzufüge.
    Ich nutze den Code::Blocks

    #include <windows.h>
    #include <string>
    
    {
    
              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;
    
          }
    

    undefined reference to CreateCompatibleDC@4' undefined reference toCreateCompatibleBitmap@12'
    undefined reference to SaveDC@4' undefined reference toSelectObject@8'
    ndefined reference to BitBlt@36' undefined reference toCreateDIBSection@24'
    undefined reference to CreateCompatibleDC@4' undefined reference toSelectObject@8'
    undefined reference to BitBlt@36' undefined reference toDeleteDC@4'

    Compilerbedingt habe ich nicht die stdxt.h drinn. Oder wie die auch immer heißt.


Anmelden zum Antworten