0

我得到了从当前鼠标位置获取像素颜色的代码。
它运作良好,但唯一的问题是,我无法从 d3d 应用程序中获取它......
我尝试了几次,但它只得到黑色 -

红色:0
绿色:0
蓝色:0

这是我的代码 -

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <d3d9.h>

HWND hWindow;

HDC hScreen;
HDC hdcMem;
HBITMAP hBitmap;
HGDIOBJ hOld;

int sX, sY, x, y;

BYTE* sData = 0;

POINT cursorPos;

int main()
{
    int Red, Green, Blue;

    hScreen = GetDC(hWindow);

    sX = GetDeviceCaps(hScreen, HORZRES);
    sY = GetDeviceCaps(hScreen, VERTRES);

    hdcMem = CreateCompatibleDC (hScreen);
    hBitmap = CreateCompatibleBitmap(hScreen, sX, sY);

    BITMAPINFOHEADER bm = {0};
    bm.biSize = sizeof(BITMAPINFOHEADER);
    bm.biPlanes = 1;
    bm.biBitCount = 32;
    bm.biWidth = sX;
    bm.biHeight = -sY;
    bm.biCompression = BI_RGB;
    bm.biSizeImage = 0; // 3 * sX * sY;

    while (1) {
        hOld = SelectObject(hdcMem, hBitmap);
        BitBlt(hdcMem, 0, 0, sX, sY, hScreen, 0, 0, SRCCOPY);
        SelectObject(hdcMem, hOld);

        free(sData);
        sData = (BYTE*)malloc(4 * sX * sY);

        GetDIBits(hdcMem, hBitmap, 0, sY, sData, (BITMAPINFO*)&bm, DIB_RGB_COLORS);

        GetCursorPos(&cursorPos);
        x = cursorPos.x;
        y = cursorPos.y;

        Red = sData[4 * ( (y * sX) + x) +2];
        Green = sData[4 * ( ( y * sX) + x) +1];
        Blue = sData[4 * ( (y * sX) + x)];

        printf("\nRed: %d\nGreen: %d\nBlue: %d\n", Red, Green, Blue);
        Sleep(300);
    }
}

谢谢!

4

1 回答 1

0

您使用哪种 d3d 应用程序?如果应用程序使用 Overlay 表面,您将无法使用上面的代码获得任何东西。Overlay Surface 广泛用于视频播放器中,它与 DirectX 中的普通表面完全不同,普通的屏幕截图软件只能从主表面捕获数据,而微软没有提供任何公共接口来从 Overlay 表面获取数据,但是一些软件能不能做到这一点,最常用的方法就是hook DirectX,那是另外一个话题了。

如果您的 d3d 应用程序没有使用 Overlay 表面,您可以使用 DiretX 从屏幕获取数据,然后从您想要的屏幕数据中获取像素。

  1. 使用 CreateOffscreenPlainSurface 创建屏幕外表面
  2. 使用 GetFrontBufferData 从屏幕获取数据
  3. 锁定表面并读取像素以获取颜色
于 2013-07-02T02:40:54.177 回答