gpt4 book ai didi

c - 来自 directx 应用程序的 Bitblt

转载 作者:行者123 更新时间:2023-11-30 17:50:13 36 4
gpt4 key购买 nike

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

谢谢!

最佳答案

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

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

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

关于c - 来自 directx 应用程序的 Bitblt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17408001/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com