我得到了代码,以便从当前鼠标位置获取像素颜色
它运作良好但唯一的问题是,我无法从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);
}
}
谢谢!
答案 0 :(得分:0)
您使用哪种d3d应用程序?如果应用程序使用覆盖表面,则无法获得上述代码。覆盖表面广泛用于视频播放器,它与DirectX中的普通表面完全不同,普通屏幕截图软件只能从主表面捕获数据,而微软没有提供任何公共接口来从Overlay表面获取数据,而是一些软件可以这样做,最常见的方法是挂钩DirectX,这是一个不同的主题。
如果你的d3d应用程序没有使用Overlay surface,你可以使用DiretX从屏幕获取数据,然后从你想要的屏幕数据中获取像素。