'$COMMENT 'BC.INI GLOBALs GLOBAL ATERROR AS INTEGER GLOBAL ATEXTENDED AS INTEGER 'END BC.INI GLOBALs 'BC.INI FUNCTIONS FUNCTION SetErrorCode(nCode AS INTEGER) AS VOID ATERROR% = nCode END FUNCTION FUNCTION SetExtendedCode(nCode AS INTEGER) AS VOID ATEXTENDED% = nCode END FUNCTION FUNCTION SetError(nError AS INTEGER, nExtended AS INTEGER, sReturnData AS STRING) AS STRING SetErrorCode(nError) SetExtendedCode(nExtended) FUNCTION = sReturnData END FUNCTION FUNCTION IsError() AS INTEGER LOCAL iErrorCode AS INTEGER iErrorCode = ATERROR ATERROR% = 0 FUNCTION = iErrorCode END FUNCTION FUNCTION IsExtended() AS INTEGER LOCAL iExtendedCode AS INTEGER iExtendedCode = ATEXTENDED ATEXTENDED = 0 FUNCTION = iExtendedCode END FUNCTION 'END BC.INI FUNCTIONS '$COMMENT GLOBAL DYNAMIC aPixels[0][0] AS INTEGER PixelGetRegion(0,0,400,300) SELECT CASE ATERROR CASE 0 MSGBOX "FUNCTION COMPLETED SUCCESSFULLY", "SUCCESS" CASE 1 MSGBOX "COORDS WERE <> THAN THEIR CLIENT RECTANGLE", "ERROR" CASE 2 MSGBOX "INVERTED BITBLT FAILED", "ERROR" CASE 3 MSGBOX "BITBLT FAILED", "ERROR" CASE 4 MSGBOX "GETDIBITS FAILED", "ERROR" END SELECT FUNCTION PixelGetRegion OPTIONAL(iXStart AS INTEGER, _ iYStart AS INTEGER, _ iXEnd AS INTEGER, _ iYEnd AS INTEGER, _ hWnd AS HWND = NULL, _ iInvert AS BOOL = 0) AS STRING 'Set to screen mode if no HWND is given IF hWnd = NULL THEN hWnd = GetDesktopWindow() 'Do the coords match what we are searching? LOCAL pCds AS RECT GetClientRect(hWnd, &pCds) IF iXStart < pCds.left OR iYStart < pCds.top OR _ iXEnd > pCds.right OR iYEnd > pCds.bottom THEN FUNCTION = SetError(1,0,"FALSE") LOCAL iWidth AS INTEGER LOCAL iHeight AS INTEGER LOCAL iTLoop AS INTEGER LOCAL hOriginal AS HGDIOBJ LOCAL bMapInfo AS BITMAPINFO LOCAL bmiHeader AS BITMAPINFOHEADER LOCAL hCCDC AS HDC LOCAL hGDC AS HDC LOCAL hBitmap AS HBITMAP iWidth = (iXEnd - iXStart)+1 iHeight = (iYEnd - iYStart)+1 iTLoop = (iWidth * iHeight) * 4 hGDC = (HDC)GetDC(hWnd) 'Create an empty bitmap to hold all the pixels currently visible 'within the search area: hCCDC = CreateCompatibleDC(hGDC) hBitmap = CreateCompatibleBitmap(hGDC, iWidth, iHeight) hOriginal = SelectObject(hCCDC, hBitmap) IF hBitmap = NULL THEN FUNCTION = PixelFree(hWnd,hGDC,hCCDC,hOriginal,hBitmap,0) 'Copy the pixels in the search-area of the screen into the DC to be searched: IF iInvert THEN IF NOT _ BitBlt(hCCDC, 0, 0, iWidth, iHeight, hGDC, iXStart, iYStart, NOTSRCCOPY) THEN _ FUNCTION = SetError(2, 0, PixelFree(hWnd,hGDC,hCCDC,hOriginal,hBitmap,"FALSE")) ELSE IF NOT _ BitBlt(hCCDC, 0, 0, iWidth, iHeight, hGDC, iXStart, iYStart, SRCCOPY) THEN _ FUNCTION = SetError(3, 0, PixelFree(hWnd,hGDC,hCCDC,hOriginal,hBitmap,"FALSE")) ENDIF 'Get at the bits bMapInfo.bmiHeader.biSize = SIZEOF(BITMAPINFOHEADER) bMapInfo.bmiHeader.biBitCount = 32 bMapInfo.bmiHeader.biHeight = -iHeight bMapInfo.bmiHeader.biWidth = iWidth bMapInfo.bmiHeader.biPlanes = 1 bMapInfo.bmiHeader.biCompression = BI_RGB DIM DYNAMIC tBuffer[(iTLoop)] AS COLORREF IF NOT GetDIBits(hCCDC, hBitmap, 0, iHeight, tBuffer, &bMapInfo, DIB_RGB_COLORS) THEN _ FUNCTION = SetError(4, 0, "FALSE") 'Clean Up PixelFree(hWnd,hGDC,hCCDC,hOriginal,hBitmap) REDIM aPixels[iXEnd + 1][iYEnd + 1] LOCAL nCount nCount = 0 FOR INTEGER iy = iYStart TO iYEnd FOR INTEGER ix = iXStart TO iXEnd aPixels[ix][iy] = RGB(GetRValue(tBuffer[nCount]), _ GetGValue(tBuffer[nCount]),GetBValue(tBuffer[nCount])) nCount++ NEXT NEXT FUNCTION = SetError(0, 0, "TRUE") END FUNCTION FUNCTION PixelFree OPTIONAL(hWnd AS HWND, _ hMainDC AS HDC, _ hNewDC AS HDC, _ hOriginal AS HGDIOBJ, _ hBitmap AS HBITMAP, _ nReturnVal AS STRING = "TRUE") AS STRING ReleaseDC(hWnd, hMainDC) SelectObject(hNewDC, hOriginal) DeleteDC(hNewDC) DeleteObject(hBitmap) FUNCTION = nReturnVal END FUNCTION