gpt4 book ai didi

c++ - 使用 wm_paint 捕获游戏窗口

转载 作者:行者123 更新时间:2023-11-28 01:55:24 45 4
gpt4 key购买 nike

我正在尝试使用带有 wm_paintwm_printclientSendMessage 捕获游戏窗口。

我已经使用 PrintWindow 成功地做到了,但是游戏可以在图形引擎之间切换,对于其中一些我得到一个白色矩形。我希望使用 SendMessage 不会有这个问题。

问题是由于 SendMessage,对于任何图形引擎,甚至对于任何程序/窗口,我都会得到一个黑色矩形。

void capture::captureProgramScreen(HWND hwnd, tImage* res)
{
RECT rc;

GetWindowRect(hwnd, &rc);

//create
HDC hdcScreen = GetDC(NULL);
HDC hdc = CreateCompatibleDC(hdcScreen);
HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, rc.right - rc.left, rc.bottom - rc.top);
res->width = rc.right - rc.left - 17;
res->height = rc.bottom - rc.top - 39;

res->absoluteTop = rc.top;
res->absoluteLeft = rc.left;

SelectObject(hdc, hbmp);




SendMessage(hwnd, WM_PRINTCLIENT, (int)hdc, PRF_CHILDREN | PRF_CLIENT | PRF_ERASEBKGND | PRF_NONCLIENT | PRF_OWNED);


BITMAPINFO MyBMInfo = { 0 };
MyBMInfo.bmiHeader.biSize = sizeof(MyBMInfo.bmiHeader);


if (0 == GetDIBits(hdc, hbmp, 0, 0, NULL, &MyBMInfo, DIB_RGB_COLORS))
{
res->error = true;
res->errorcode = 2;
return;
}


res->v = std::vector<BYTE>(MyBMInfo.bmiHeader.biSizeImage);


MyBMInfo.bmiHeader.biBitCount = 32;
MyBMInfo.bmiHeader.biCompression = BI_RGB;

MyBMInfo.bmiHeader.biHeight = abs(MyBMInfo.bmiHeader.biHeight);

if (0 == GetDIBits(hdc, hbmp, 0, MyBMInfo.bmiHeader.biHeight, &(res->v[0]), &MyBMInfo, DIB_RGB_COLORS))
{
res->error = true;
res->errorcode = 3;
res->width = 0;
res->height = 0;
res->v.clear();
return;
}


//4 Bytes per pixel order (B G R A) from [left to right] [bottom to top]



return;
}

谢谢!

最佳答案

至少有几个可能的问题:

  1. 并非所有程序/窗口都实现 WM_PRINTCLIENT。许多游戏甚至没有实现 WM_PAINT,因为它们以所需的帧速率连续绘制,而不是响应更新自身的需要。许多游戏使用更新的图形 API,这些 API 并不真正绘制到设备上下文。

  2. 我不确定您为什么要两次调用 GetDIBits。第一个发生在您初始化 BITMAPINFO 的所有字段之前,因此一个将失败。当您第二次打电话时,它仍未完全填写。

关于c++ - 使用 wm_paint 捕获游戏窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41409563/

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