screenshot



  • ich war schon länger auf der suche nach einen code der mir einen screenshot macht und die .bmp abspeichert.

    #include <windows.h>
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h> 
    #include <conio.h>
    
    using namespace std;
    PBITMAPINFO CreateBitmapInfoStruct(HWND hwnd, HBITMAP hBmp)
    { 
        BITMAP bmp; 
        PBITMAPINFO pbmi; 
        WORD    cClrBits; 
    
        // Retrieve the bitmap color format, width, and height. 
        if (!GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp)) 
            printf("GetObject", hwnd); 
    
        // Convert the color format to a count of bits. 
        cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel); 
        if (cClrBits == 1) 
            cClrBits = 1; 
        else if (cClrBits <= 4) 
            cClrBits = 4; 
        else if (cClrBits <= 8) 
            cClrBits = 8; 
        else if (cClrBits <= 16) 
            cClrBits = 16; 
        else if (cClrBits <= 24) 
            cClrBits = 24; 
        else cClrBits = 32; 
    
        // Allocate memory for the BITMAPINFO structure. (This structure 
        // contains a BITMAPINFOHEADER structure and an array of RGBQUAD 
        // data structures.) 
    
         if (cClrBits != 24) 
             pbmi = (PBITMAPINFO) LocalAlloc(LPTR, 
                        sizeof(BITMAPINFOHEADER) + 
                        sizeof(RGBQUAD) * (1<< cClrBits)); 
    
         // There is no RGBQUAD array for the 24-bit-per-pixel format. 
    
         else 
             pbmi = (PBITMAPINFO) LocalAlloc(LPTR, 
                        sizeof(BITMAPINFOHEADER)); 
    
        // Initialize the fields in the BITMAPINFO structure. 
    
        pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
        pbmi->bmiHeader.biWidth = bmp.bmWidth; 
        pbmi->bmiHeader.biHeight = bmp.bmHeight; 
        pbmi->bmiHeader.biPlanes = bmp.bmPlanes; 
        pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel; 
        if (cClrBits < 24) 
            pbmi->bmiHeader.biClrUsed = (1<<cClrBits); 
    
        // If the bitmap is not compressed, set the BI_RGB flag. 
        pbmi->bmiHeader.biCompression = BI_RGB; 
    
        // Compute the number of bytes in the array of color 
        // indices and store the result in biSizeImage. 
        // For Windows NT, the width must be DWORD aligned unless 
        // the bitmap is RLE compressed. This example shows this. 
        // For Windows 95/98/Me, the width must be WORD aligned unless the 
        // bitmap is RLE compressed.
        pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8
                                      * pbmi->bmiHeader.biHeight; 
        // Set biClrImportant to 0, indicating that all of the 
        // device colors are important. 
         pbmi->bmiHeader.biClrImportant = 0; 
         return pbmi; 
     } 
    void CreateBMPFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi,HBITMAP hBMP, HDC hDC) 
     { 
         HANDLE hf;                 // file handle 
        BITMAPFILEHEADER hdr;       // bitmap file-header 
        PBITMAPINFOHEADER pbih;     // bitmap info-header 
        LPBYTE lpBits;              // memory pointer 
        DWORD dwTotal;              // total count of bytes 
        DWORD cb;                   // incremental count of bytes 
        BYTE *hp;                   // byte pointer 
        DWORD dwTmp; 
    
        pbih = (PBITMAPINFOHEADER) pbi; 
        lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);
    
        if (!lpBits) 
             printf("GlobalAlloc", hwnd); 
    
        // Retrieve the color table (RGBQUAD array) and the bits 
        // (array of palette indices) from the DIB. 
        if (!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi, 
            DIB_RGB_COLORS)) 
        {
            printf("GetDIBits", hwnd); 
        }
    
        // Create the .BMP file. 
        hf = CreateFile(pszFile, 
                       GENERIC_READ | GENERIC_WRITE, 
                       (DWORD) 0, 
                        NULL, 
                       CREATE_ALWAYS, 
                       FILE_ATTRIBUTE_NORMAL, 
                       (HANDLE) NULL); 
        if (hf == INVALID_HANDLE_VALUE) 
            printf("CreateFile", hwnd); 
        hdr.bfType = 0x4d42;        // 0x42 = "B" 0x4d = "M" 
        // Compute the size of the entire file. 
        hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + 
                     pbih->biSize + pbih->biClrUsed 
                     * sizeof(RGBQUAD) + pbih->biSizeImage); 
        hdr.bfReserved1 = 0; 
        hdr.bfReserved2 = 0; 
    
        // Compute the offset to the array of color indices. 
        hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + 
                        pbih->biSize + pbih->biClrUsed 
                        * sizeof (RGBQUAD); 
    
        // Copy the BITMAPFILEHEADER into the .BMP file. 
        if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER), 
            (LPDWORD) &dwTmp,  NULL)) 
        {
           printf("WriteFile", hwnd); 
        }
    
        // Copy the BITMAPINFOHEADER and RGBQUAD array into the file. 
        if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER) 
                      + pbih->biClrUsed * sizeof (RGBQUAD), 
                      (LPDWORD) &dwTmp, ( NULL)))
            printf("WriteFile", hwnd); 
    
        // Copy the array of color indices into the .BMP file. 
        dwTotal = cb = pbih->biSizeImage; 
        hp = lpBits; 
        if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL)) 
               printf("WriteFile", hwnd); 
    
        // Close the .BMP file. 
         if (!CloseHandle(hf)) 
               printf("CloseHandle", hwnd); 
    
        // Free memory. 
        GlobalFree((HGLOBAL)lpBits);
    }
    int main()
    {
    HDC hdcScreen, hdcCompatible,hdc;
    HBITMAP hbmScreen;
    HWND hwnd = 0;
    BITMAP bmp; 
    hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); 
    hdcCompatible = CreateCompatibleDC(hdcScreen); 
    
    // Create a compatible bitmap for hdcScreen. 
    
    hbmScreen = CreateCompatibleBitmap(hdcScreen, 
                         GetDeviceCaps(hdcScreen, HORZRES), 
                         GetDeviceCaps(hdcScreen, VERTRES)); 
    
    if (hbmScreen == 0) 
        printf("hbmScreen", NULL); 
    
    // Select the bitmaps into the compatible DC. 
    
    if (!SelectObject(hdcCompatible, hbmScreen)) 
        printf("Compatible Bitmap Selection", NULL); 
    
            // Hide the application window. 
    
            ShowWindow(hwnd, SW_HIDE); 
    
             //Copy color data for the entire display into a 
             //bitmap that is selected into a compatible DC. 
    
            if (!BitBlt(hdcCompatible, 
                   0,0, 
                   bmp.bmWidth, bmp.bmHeight, 
                   hdcScreen, 
                   0,0, 
                   SRCCOPY)) 
    
            printf("Screen to Compat Blt Failed", hwnd); 
    
            // Redraw the application window. 
    
            ShowWindow(hwnd, SW_SHOW); 
    SelectObject(hdcCompatible, hbmScreen); // Gerätekontext auswählen
    // ShowWindow(hwnd, SW_HIDE); 
    BitBlt(hdcCompatible, 0,0, GetSystemMetrics(SM_CXSCREEN),
    GetSystemMetrics(SM_CYSCREEN), hdcScreen, 0,0, SRCCOPY); 
    //ShowWindow(hwnd, SW_SHOW); 
    
    //CreateBMPFile aus Ms-Internet-Hilfe
    hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); 
    hdcCompatible = CreateCompatibleDC(hdcScreen); 
    
    // Create a compatible bitmap for hdcScreen. 
    
    hbmScreen = CreateCompatibleBitmap(hdcScreen, 
                         GetDeviceCaps(hdcScreen, HORZRES), 
                         GetDeviceCaps(hdcScreen, VERTRES)); 
    
    if (hbmScreen == 0) 
        printf("hbmScreen", hwnd); 
    
    // Select the bitmaps into the compatible DC. 
    
    if (!SelectObject(hdcCompatible, hbmScreen)) 
        printf("Compatible Bitmap Selection", hwnd); 
    
            // Hide the application window. 
    
            ShowWindow(hwnd, SW_HIDE); 
    
             //Copy color data for the entire display into a 
             //bitmap that is selected into a compatible DC. 
    
            if (!BitBlt(hdcCompatible, 
                   0,0, 
                   bmp.bmWidth, bmp.bmHeight, 
                   hdcScreen, 
                   0,0, 
                   SRCCOPY)) 
    
            printf("Screen to Compat Blt Failed", hwnd); 
    
            // Redraw the application window. 
    
            ShowWindow(hwnd, SW_SHOW); 
    //-- Storing an Image --
    //CreateBMPFile(hwnd, "D:\\Screenshot\\TestBild.bmp", ????, hbmScreen, hdc);
    
    BITMAPINFO pbi = 
    CreateBitmapInfoStruct(
    0, 
    hbmScreen); //Error 1: conversion from `tagBITMAPINFO*' to non-scalar type `tagBITMAPINFO' requested 
    CreateBMPFile(NULL, "C:\\Screenshot\\TestBild.bmp", pbi, hbmScreen, hdc); //Error 2: cannot convert `BITMAPINFO' to `tagBITMAPINFO*' for argument `3' to `void CreateBMPFile(HWND__*, TCHAR*, tagBITMAPINFO*, HBITMAP__*, HDC__*)' 
    }
    


  • Hättest du mal hier im Forum gesucht, sowas gibt's hier nämlich schon. Außerdem ist das WinAPI.



  • 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.


Anmelden zum Antworten