GetDiBits zawodzi podczas drugiego wywołania

0

Witam serdecznie, próbuję napisać aplikację robiącą zrzut ekranu(pulpitu) do bitmapy a następnie wyciągającą z niej informacje w celu dalszej manipulacji/operacji.

    int ScreenX = GetSystemMetrics(SM_CXSCREEN);
    int ScreenY = GetSystemMetrics(SM_CYSCREEN);

    BYTE* ScreenData = new BYTE[3*ScreenX*ScreenY];


    HDC hdc = GetDC(HWND_DESKTOP),
    hdcMem = CreateCompatibleDC (hdc);
    HBITMAP hBitmap = CreateCompatibleBitmap(hdc, ScreenX, ScreenY);

    
    BITMAPINFO bmi ;
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 24;
    bmi.bmiHeader.biWidth = ScreenX;
    bmi.bmiHeader.biHeight = -ScreenY;
    bmi.bmiHeader.biCompression = BI_RGB;
    SelectObject(hdcMem, hBitmap);
    BitBlt(hdcMem, 0, 0, ScreenX, ScreenY, hdc, 0, 0, SRCCOPY);

    GetDIBits(hdc, hBitmap, 0, ScreenY, ScreenData, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
    DeleteObject(hBitmap);
    DeleteDC(hdcMem);
    ReleaseDC(NULL, hdc);


    int startX = 1351;
    int startY = 151;


    BYTE r = ScreenData[3*((startY*ScreenX)+startX)+2];
    BYTE g = ScreenData[3*((startY*ScreenX)+startX)+1];
    BYTE b = ScreenData[3*((startY*ScreenX)+startX)];
    Label4->Caption = r;
    Label7->Caption = g;
    Label8->Caption = b;

    delete [] ScreenData;

Powyższy kod mam wrzucony do timera ustawionego na 500 ms. Działa on częściowo, tzn na zmianę: Podczas pierwszego wywołania działa, podczas drugiego nie, potem znowu działa i tak w kółko. W efekcie co pół sekundy w Labelach mam widoczne wartości kolorów, przez następne pół zero i tak dalej. Co jest przyczyną problemu ?

0

BYTE* ScreenData = new BYTE[3ScreenXScreenY];


Tak nawiasem: wielkość bajtowa wiersza bitmapy (*scanline*) powinna być wielokrotnością DWORDa. Jeśli tego nie przypilnujesz, program może pisać poza zakresem tablicy.

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