我正在尝试使用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
创建的窗口,它仍然是完全黑色的。在另一个论坛上,他们提到这可能与双缓冲问题有关。我不知道如何解决这个问题。
你对SDL_RenderReadPixels()
的作用有一个根本的误解。实际上,它用于拍摄“屏幕截图”,但“屏幕截图”将是您使用该特定渲染器渲染的内容,而不是其他内容。使用SDL中的任何可用内容,您将无法完成所需的任务。
截取整个屏幕的截图通常需要提升权限(我不知道Windows),并且超出了SDL的范围。