我正在尝试弄清楚如何截取当前未聚焦的窗口的屏幕截图,因此该窗口很可能会被其他窗口部分或完全遮挡。
我在此链接上找到了一个示例使用 X11 的 Xcomposite 扩展获取被覆盖、不可见或最小化的窗口的屏幕截图 https://stackoverflow.com/questions/21512177/get-a-screenshot-of-a-window-that-is-cover-or-not-visible-or-minimized-with-xcom但我无法让它工作,任何时候我截取屏幕截图时,我都只会得到奇怪的输出,大部分是黑色的,就像我访问了错误的缓冲区或其他东西一样。
XID xid = windowID; // Checked and confirmed that the window ID is correct
XGetWindowAttributes( display, windowID, &attrributes );
XCompositeRedirectWindow (display, xid, CompositeRedirectAutomatic);
Pixmap pixmap = XCompositeNameWindowPixmap (display, xid);
// Extract the data
XRenderPictFormat *format = XRenderFindVisualFormat (display, attrributes.visual);
XRenderPictureAttributes pa;
pa.subwindow_mode = IncludeInferiors;
Picture picture = XRenderCreatePicture (display, xid, format, CPSubwindowMode, &pa);
QPixmap finalPix (attrributes.width, attrributes.height);
XRenderComposite (display, PictOpSrc, picture, None, finalPix.x11PictureHandle(), 0,0, 0,0, 0,0, attrributes.width, attrributes.height);
XFreePixmap (display, pixmap);
XCompositeUnredirectWindow (display, xid, CompositeRedirectAutomatic);
return finalPix;
(Edit: 这个屏幕截图是从一个完全可见的窗口中获取的,而不是一个被遮挡的窗口,所以我想目前的问题甚至不是 X11 没有绘制它,而是我的实现似乎不起作用,我不明白为什么。)