SDL_RenderReadPixels returns 黑色矩形?

SDL_RenderReadPixels returns a black rectangle?

我正在尝试使用 SDL2 截取 windows 中整个桌面的屏幕截图。但是,当查看生成的 .bmp 文件时,它完全是黑色的。任何帮助将不胜感激。

这是我的代码:

SDL_Init(SDL_INIT_EVERYTHING);

    SDL_Window* window = SDL_CreateWindowFrom(GetDesktopWindow());

    int w, h;

    SDL_GetWindowSize(window, &w, &h);

    uint32_t wnd_pix_fmt = SDL_GetWindowPixelFormat(window);

    if(wnd_pix_fmt == SDL_PIXELFORMAT_UNKNOWN)
        SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Window pix fmt error", SDL_GetError(), NULL);

    SDL_Surface* screenshot = SDL_CreateRGBSurfaceWithFormat(0, w, h, 32, wnd_pix_fmt);
    if(!screenshot)
        SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "RGB surface error", SDL_GetError(), NULL);

    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);
    if(!renderer)
        SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Renderer error", SDL_GetError(), NULL);

    if(SDL_RenderReadPixels(renderer, &screenshot->clip_rect, screenshot->format, screenshot->pixels, screenshot->pitch))
        SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "RendererReadPixels error", SDL_GetError(), NULL);

    SDL_SaveBMP(screenshot, "screenshot.bmp");

    SDL_FreeSurface(screenshot);

注意:即使我将 SDL_Window* window 设置为使用 SDL_CreateWindow 创建的 window,它仍然完全是黑色的。在另一个论坛上,他们提到这可能与双缓冲问题有关。我不知道如何解决这样的问题。

您对 SDL_RenderReadPixels() 的作用存在根本性的误解。实际上,它用于获取 "screenshots",但 "screenshot" 将是您使用 特定渲染器 渲染的内容,仅此而已。您将无法使用 SDL 中提供的任何内容来完成您想要的。

截取整个屏幕的屏幕截图通常需要提升权限(我不知道 Windows)并且超出了 SDL 的范围。