DWORD FindColor(LPVOID lParam)
{
HDC hDCscreen = GetDC(NULL);
int nWidth = 20,nHeight = 20;
BYTE R,G,B;
HDC hComDC = CreateCompatibleDC(hDCscreen);
BITMAPINFO bmpInfo;
HBITMAP hComBitMap = CreateCompatibleBitmap(hDCscreen,nWidth,nHeight);
HGDIOBJ OldHgdobj = SelectObject(hComDC,hComBitMap);
BitBlt(hComDC,0,0,nWidth,nHeight,hDCscreen,0,0,SRCCOPY);
HANDLE hHeap = GetProcessHeap();
    LPVOID lpBuffer = HeapAlloc(hHeap,HEAP_ZERO_MEMORY,nHeight*nWidth*4);
ZeroMemory(&bmpInfo,sizeof(bmpInfo));
bmpInfo.bmiHeader.biBitCount = 32;
bmpInfo.bmiHeader.biCompression = BI_RGB;
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = nWidth;
bmpInfo.bmiHeader.biHeight = nHeight;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biSizeImage = 0;
DWORD Color = NULL,a=0; printf("被扫描行数%d\n",GetDIBits(hComDC,hComBitMap,0,bmpInfo.bmiHeader.biHeight,lpBuffer,&bmpInfo,DIB_RGB_COLORS));
for (int h = nHeight;h >= 0;h--)
{
for(int w = 0; w<nWidth ; w++)
{
/*RGB GBR*/
memcpy(&Color,LPVOID((int)lpBuffer  + h * w * 4 + 1),3);//32位色最高字节表示Alpha?
printf("坐标 - X:%d Y:%d 颜色:%X\n",w, h,Color);
SetPixel(hDCscreen,w,h,Color);//设置目标区域的颜色,结果目标区域模糊 设置目标区域的颜色,结果目标区域模糊!我想大家帮忙修改我的函数 让目标区域不会乱
}
}
HeapFree(hHeap,HEAP_NO_SERIALIZE,lpBuffer);
ReleaseDC(NULL,hDCscreen);
ReleaseDC(NULL,hComDC);
DeleteObject(OldHgdobj);
DeleteObject(hComBitMap);
return FALSE;
}

解决方案 »

  1.   

    一个color里面有4个byte,分别装R/G/B/Alpha
    memcpy(&Color,LPVOID((BYTE*)lpBuffer  + h * w * 4),4);
      

  2.   

    DWORD FindColor(LPVOID lParam)
    {
        HDC hDCscreen = GetDC(NULL);
        int nWidth = 20,nHeight = 20;
        BYTE R,G,B;
        HDC hComDC = CreateCompatibleDC(hDCscreen);
        BITMAPINFO bmpInfo;
        HBITMAP hComBitMap = CreateCompatibleBitmap(hDCscreen,nWidth,nHeight);
        HGDIOBJ OldHgdobj = SelectObject(hComDC,hComBitMap);
        BitBlt(hComDC,0,0,nWidth,nHeight,hDCscreen,0,0,SRCCOPY);
        HANDLE hHeap = GetProcessHeap();
        LPVOID lpBuffer = HeapAlloc(hHeap,HEAP_ZERO_MEMORY,nHeight*nWidth*4);
        ZeroMemory(&bmpInfo,sizeof(bmpInfo));
        bmpInfo.bmiHeader.biBitCount = 32;
        bmpInfo.bmiHeader.biCompression = BI_RGB;
        bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        bmpInfo.bmiHeader.biWidth = nWidth;
        bmpInfo.bmiHeader.biHeight = nHeight;
        bmpInfo.bmiHeader.biPlanes = 1;
        bmpInfo.bmiHeader.biSizeImage = 0;
        RGBQUAD Color ;

        printf("被扫描行数%d\n",GetDIBits(hComDC,hComBitMap,0,bmpInfo.bmiHeader.biHeight,lpBuffer,&bmpInfo,DIB_RGB_COLORS));
        for (int h = nHeight-1;h >= 0;--h)
        {
            for(int w = 0; w<nWidth ; ++w)
            {
                /*RGB GBR*/
                memcpy(&Color,LPVOID((RGBQUAD*)lpBuffer  + (nWidth*h + w)),3);//32位色最高字节表示Alpha?
                printf("坐标 - X:%d Y:%d 颜色:RGB(%02X,%02X,%02X)\n",w,nHeight-1-h,Color.rgbRed,Color.rgbGreen,Color.rgbBlue);
                SetPixel(hDCscreen,w,nHeight-1-h,RGB(Color.rgbRed,Color.rgbGreen,Color.rgbBlue));
    //设置目标区域的颜色,结果目标区域模糊 设置目标区域的颜色,结果目标区域模糊!我想大家帮忙修改我的函数 让目标区域不会乱
            }
        }
        HeapFree(hHeap,HEAP_NO_SERIALIZE,lpBuffer);
        ReleaseDC(NULL,hDCscreen);
        ReleaseDC(NULL,hComDC);
        DeleteObject(OldHgdobj);
        DeleteObject(hComBitMap);
        return FALSE;
    }