1

私は 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 が表示されます。したがって、私のコードには何か問題があるはずです。バグが見つからない!

4

0 に答える 0