zrzut ekranu

0

Witam.
Mam pewien problem, a mianowicie piszę fragment kodu odpowiedzialny za wykonywanie printscreen'a (przy pomocy winAPI) niestety nie wiem dlaczego po skompilowaniu kodu otrzymuję pasiasty biało-czarny obraz.

oto kod:

#include <vcl.h>
#include <windows.h>
#include <stdio.h>
#include <iostream.h>
#pragma hdrstop

//---------------------------------------------------------------------------
void zapisz(FILE ,int, int);
#pragma argsused
int main(int argc, char
argv[])
{
FILE *plik;
plik = fopen("desktop.bmp", "w");
DWORD kolor;
RECT rozmiar_okna;
HWND desktop = GetDesktopWindow();
HDC desktopdc = GetDC(desktop);
//HBITMAP mapa = CreateCompatibleBitmap(desktopdc, rozmiar_okna.right, rozmiar_okna.bottom);

    //informacje o rozmiarze wysokosci okna zawiera :right a o szerokosci :bottom
    GetWindowRect(desktop, &rozmiar_okna);
   

//wynika z budowy pliku .bmp
zapisz(plik,19778,2);
zapisz(plik,rozmiar_okna.bottomrozmiar_okna.right4+55,4);
zapisz(plik,0,2);
zapisz(plik,0,2);
zapisz(plik,1078,4);
zapisz(plik,40,4);
zapisz(plik,rozmiar_okna.right,4);
zapisz(plik,rozmiar_okna.bottom,4);
zapisz(plik,0,2);
zapisz(plik,24,2);
zapisz(plik,0,4);
zapisz(plik,0,4);
zapisz(plik,0,4);
zapisz(plik,0,4);
zapisz(plik,0,4);
zapisz(plik,0,4);
zapisz(plik,17468,0);

//Zapisanie zrzutu ekranu do bitmapy
for (int x=0; x<rozmiar_okna.right; x++)
{
for(int y = 0; y<rozmiar_okna.bottom; y++)
{
kolor = GetPixel(&desktopdc, x, y);
//zapisanie wartosci koloru do pliku
zapisz(plik, kolor, 4);
}
}

    fclose(plik);
    system("PAUSE");
    return 0;

}
//---------------------------------------------------------------------------

void zapisz(FILE * plik, int wartosc, int rozmiar)
{

int w = wartosc-1;
for(int a=0; a<rozmiar; a++)
{
int zwr= (wartosc<<((w-a)8))>>(w8); //poniewaz fputc zapisuje BYTE do pliku
fputc(zwr, plik);
}
}

Przypuszczam że kłopot tkwi w kontekscie urządzenia (ponoć z niekażdego można czytać piksele - ale w dokumentacji nie ma przeciwwskazać dla Desktop'u)

Z góry dzięki

0

A to pisane przy pomocy "bardziej" WinAPI ;)

// Capture a BMP
   HDC               hScreen, hCompat;
   HBITMAP            hBm;
   BITMAP            bmp;
   BITMAPINFO         bmpinfo;
   LPVOID            pBits;
   DWORD            dwWidth, dwHeight, dwBPP, dwNumColors, dwBytes;
   BITMAPFILEHEADER   bitmapfileheader;
   BITMAPINFOHEADER   bitmapinfoheader;
   RGBQUAD            colors[256];
   HANDLE            hfile;

   int               iRet;

   // the original image dimensions, before we made them divisible by 8
   WORD            Ximage_original, Yimage_original;
   bitstring         fillbits;

   // cleanup
   ZeroMemory( &bmp, sizeof( bmp ) );
   ZeroMemory( &bmpinfo, sizeof( bmpinfo ) );
   ZeroMemory( &bitmapfileheader, sizeof( bitmapfileheader ) );
   ZeroMemory( &bitmapinfoheader, sizeof( bitmapinfoheader ) );
   ZeroMemory( &colors, sizeof( colors ) );

   // desktop
   hScreen = CreateDC( "DISPLAY", NULL, NULL, NULL );
   dwWidth = GetDeviceCaps( hScreen, HORZRES );
   dwHeight = GetDeviceCaps( hScreen, VERTRES );
   dwBPP = 24; //dwBPP = GetDeviceCaps( hScreen, BITSPIXEL );
   dwNumColors = GetDeviceCaps( hScreen, NUMCOLORS );
   hCompat = CreateCompatibleDC( hScreen );

   bmpinfo.bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
   bmpinfo.bmiHeader.biWidth = dwWidth;
   bmpinfo.bmiHeader.biHeight = dwHeight;
   bmpinfo.bmiHeader.biPlanes = 1;
   bmpinfo.bmiHeader.biBitCount = (WORD)dwBPP;
   bmpinfo.bmiHeader.biCompression = BI_RGB;
   bmpinfo.bmiHeader.biSizeImage = 0;
   bmpinfo.bmiHeader.biXPelsPerMeter = 0;
   bmpinfo.bmiHeader.biYPelsPerMeter = 0;
   bmpinfo.bmiHeader.biClrUsed = dwNumColors;
   bmpinfo.bmiHeader.biClrImportant = dwNumColors;
   hBm = CreateDIBSection( hScreen, &bmpinfo, DIB_PAL_COLORS, &pBits, NULL, 0 );

   SelectObject( hCompat, hBm );   
   BitBlt( hCompat, 0, 0, dwWidth, dwHeight, hScreen, 0, 0, SRCCOPY );
   
   // BMP
   if ( dwNumColors != 0 )
      dwNumColors = GetDIBColorTable( hCompat, 0, dwNumColors, colors );

   bitmapfileheader.bfType = 0x4D42;
   bitmapfileheader.bfSize = ((dwWidth * dwHeight * dwBPP)/8) + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (dwNumColors * sizeof(RGBQUAD));
   bitmapfileheader.bfReserved1 = 0;
   bitmapfileheader.bfReserved2 = 0;
   bitmapfileheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (dwNumColors * sizeof(RGBQUAD)); 
   bitmapinfoheader.biSize = sizeof(BITMAPINFOHEADER);
   bitmapinfoheader.biWidth = dwWidth;
   bitmapinfoheader.biHeight = dwHeight;
   bitmapinfoheader.biPlanes = 1;
   bitmapinfoheader.biBitCount = (WORD)dwBPP;
   bitmapinfoheader.biCompression = BI_RGB;
   bitmapinfoheader.biSizeImage = 0;
   bitmapinfoheader.biXPelsPerMeter = 0;
   bitmapinfoheader.biYPelsPerMeter = 0;
   bitmapinfoheader.biClrUsed = dwNumColors;
   bitmapinfoheader.biClrImportant = 0;
   
   hfile = CreateFile( szBMPname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
   WriteFile( hfile, &bitmapfileheader, sizeof(BITMAPFILEHEADER), &dwBytes, NULL );
   WriteFile( hfile, &bitmapinfoheader, sizeof(BITMAPINFOHEADER), &dwBytes, NULL );
   if ( dwNumColors != 0 )
      WriteFile( hfile, colors, sizeof(RGBQUAD) * dwNumColors, &dwBytes, NULL );
   WriteFile( hfile, pBits, (dwWidth*dwHeight*dwBPP)/8, &dwBytes, NULL );
   CloseHandle( hfile );
   DeleteObject( hBm );
   DeleteDC( hScreen );
   DeleteDC( hCompat ); 

1 użytkowników online, w tym zalogowanych: 0, gości: 1