【问题标题】:Bitblt from directx application来自directx 应用程序的Bitblt
【发布时间】:2013-06-28 18:46:53
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: c directx direct3d bitblt


    【解决方案1】:

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

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

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

    【讨论】:

    • 我认为最简单的方法是对你的 d3d 应用程序进行屏幕截图(使用键盘上的打印屏幕键),如果屏幕截图是空白的,那就是覆盖表面。
    • 我做了测试,它不是空白的......我得到了截图!任何可以帮助我进入前端缓冲区的示例代码?谢谢!
    • 你可以用directx谷歌截屏,结果很多,看看这个codeproject.com/Articles/5051/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多