来自directx应用程序的Bitblt

时间:2013-07-01 15:18:56

标签: c directx direct3d bitblt

我得到了代码,以便从当前鼠标位置获取像素颜色 它运作良好但唯一的问题是,我无法从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);
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

您使用哪种d3d应用程序?如果应用程序使用覆盖表面,则无法获得上述代码。覆盖表面广泛​​用于视频播放器,它与DirectX中的普通表面完全不同,普通屏幕截图软件只能从主表面捕获数据,而微软没有提供任何公共接口来从Overlay表面获取数据,而是一些软件可以这样做,最常见的方法是挂钩DirectX,这是一个不同的主题。

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

  1. 使用CreateOffscreenPlainSurface创建屏幕外表面
  2. 使用GetFrontBufferData从屏幕获取数据
  3. 锁定曲面并读取像素以获得颜色