首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用wm_paint捕获游戏窗口

使用wm_paint捕获游戏窗口
EN

Stack Overflow用户
提问于 2016-12-31 15:24:04
回答 1查看 211关注 0票数 0

我试图用SendMessagewm_paintwm_printclient来捕捉游戏窗口。

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

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

代码语言:javascript
复制
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;
}

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-31 17:41:30

至少有几个可能的问题:

  1. 并不是所有的程序/窗口都实现WM_PRINTCLIENT。许多游戏甚至没有实现WM_PAINT,因为它们不断地以自己想要的帧速率绘制,而不是响应更新自己的需要。许多游戏使用新的图形API,这些API并没有真正吸引到设备上下文。
  2. 我不知道你为什么要给GetDIBits打两个电话。第一种情况发生在初始化BITMAPINFO的所有字段之前,这样就会失败。到你打第二次电话的时候还没有完全填好。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41409563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档