私は Windows API/GDI の初心者です。このコードでやりたいことは、完全なスクリーンショットをメモリ バッファに取り込むことだけです。
int __cdecl main(void)
{
int width = GetSystemMetrics( SM_CXSCREEN );
int height = GetSystemMetrics( SM_CYSCREEN );
char *bmpBuf;
FILE* bmpFile;
HDC dcScreen = GetDC( NULL );
HDC dcCapt = CreateCompatibleDC( dcScreen );
HBITMAP hbmpCapt = CreateCompatibleBitmap( dcScreen, width, height );
BITMAP bmpCapt;
BITMAPINFOHEADER bi;
size_t bmpSize;
SelectObject( dcCapt, hbmpCapt );
BitBlt( dcCapt, 0,0, width, height, dcScreen, 0,0, SRCCOPY | CAPTUREBLT );
GetObject( hbmpCapt, sizeof(BITMAP), &bmpCapt );
bmpSize = ((bmpCapt.bmWidth*32+31)/32)*4*bmpCapt.bmHeight;
bmpBuf = (char*)malloc( bmpSize );
GetDIBits( dcCapt, hbmpCapt, 0, (UINT)bmpCapt.bmHeight, bmpBuf, (LPBITMAPINFO)&bi, DIB_RGB_COLORS );
bmpFile = fopen( "screenshot.raw", "w" );
if( !bmpFile )
printf( "Can't open file\n" );
else {
fwrite( bmpBuf, 1, bmpSize, bmpFile );
fclose( bmpFile );
}
printf( "Image( %d x %d ) written\n", bmpCapt.bmWidth, bmpCapt.bmHeight );
DeleteDC( dcCapt );
DeleteObject( hbmpCapt );
return 0;
}
メモリ バッファを .raw ファイルに保存することができました。ただし、この .raw ファイルを Photoshop で開くと (サイズと形式を PS に伝えます)、ALL BLACK が表示されます。したがって、私のコードには何か問題があるはずです。バグが見つからない!