0

basically what i'm trying to achieve is a continuous flow of taking snapshots of specific part of a window. Up to now I've managed to take the screenshot and parse it pixelwise. However, all screenshots are black. Please help this newbie. No errors returned, FindWindow works and returns the correct window(to appwnd). I've been debugging this for the past 3 days and i'm out of ideas. Also i need to mention i am releasing the memory after using everything, to not clamp up my ram.I'm running Windows 10 last patch.
snippet of Code:

BOOL myfunction(appwnd){
RECT rcWindow;
    GetWindowRect(appwnd, &rcWindow);
    BITMAP bm;
    HBITMAP hbmap;
    HBITMAP hbmapold;
    BITMAPINFO bmi;
    HDC hdcShot;
//a while starts here(not the issue)

        RECT rc;//get window rectangle
        GetWindowRect(appwnd, &rc);
        //creating bitmaps
        HDC hdc = GetDC(0);

        hdcShot = CreateCompatibleDC(hdc);
        hbmap = CreateCompatibleBitmap(hdc, rc.right - rc.left, rc.bottom - rc.top);

        //

        if (!BitBlt(hdcShot, 0, 0, rc.right - rc.left, rc.bottom - rc.top, GetDC(0), rc.left, rc.right, SRCCOPY | CAPTUREBLT))
        {
            printf("bitblt failed");
            system("pause");

        }
        SelectObject(hdcShot, hbmap);
        if (!GetObject(hbmap, sizeof(BITMAP), (LPSTR)&bm))
        {
            printf("error at getobject");
            system("pause");
            return false;
        }
        int bitsperpixel = bm.bmBitsPixel;

        if (bitsperpixel != 32 || bm.bmPlanes != 1)
        {
            printf("error at bitsperpixel/bm planes");
            system("pause");
            return false;
        }

        SetupBitmapInfo(bmi, bm.bmWidth, bm.bmHeight, bitsperpixel);




        HDC hdcShotNew = CreateCompatibleDC(hdcShot);
        HBITMAP hbmapNew = CreateCompatibleBitmap(hdcShot, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top);


        HBITMAP OldBmp = (HBITMAP)SelectObject(hdcShotNew, hbmapNew);
        
        int width = rcWindow.right - rcWindow.left;
        int height = rcWindow.bottom - rcWindow.top;
        printf("\nwidth:%i", width);
        printf("\nheight:%i", height);
        //copy the screen using bitblt
        BitBlt(hdcShotNew, 0, 0, width, height , hdcShot,0,0,SRCCOPY|CAPTUREBLT);
        pPixels = new RGBQUAD[bm.bmWidth * bm.bmHeight];
        if (!pPixels)
        {
            printf("ppixels failed");
            return false;
            
        }
        SelectObject(hdcShotNew, OldBmp);

        
        if (GetDIBits(hdcShotNew, hbmapNew, 0, bm.bmHeight, pPixels, &bmi, DIB_RGB_COLORS)==0)
        {
            ReleaseDC(appwnd, hdcShot);
            printf("getdibits failed");
            delete[] pPixels;
            return false;
        }
    }   

Snippet of printing pixels :

printf("\n%i,%i,%i", (int)pPixels[p].rgbRed, (int)pPixels[p].rgbGreen, (int)pPixels[p].rgbBlue);

all pixels are 0, always.

Snippet of SetupBitmapInfo:

void SetupBitmapInfo(BITMAPINFO& bmi, int bWidth, int bHeight, int bitsperpixel)
{   
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = bWidth;
    bmi.bmiHeader.biHeight = bHeight;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = bitsperpixel;
    bmi.bmiHeader.biCompression = BI_RGB;
    bmi.bmiHeader.biSizeImage = 0;
}
waib10
  • 1
  • 2
  • Does this answer your question? [Screenshot with BitBlt results in black image on Windows 10](https://stackoverflow.com/questions/43595289/screenshot-with-bitblt-results-in-black-image-on-windows-10) – Botje Jul 31 '20 at 08:39
  • No, I have tried the foreground window workaround. – waib10 Jul 31 '20 at 08:57
  • It is not in your code, so I could not know that. – Botje Jul 31 '20 at 08:58
  • I didn't explain myself sorry about that, I meant i have just tried that workaround and it didn't work , still all black. – waib10 Jul 31 '20 at 09:03

0 Answers0