我试图弄清楚如何拍摄当前没有聚焦的窗口的屏幕截图,因此窗口很可能被其他窗口部分或完全遮挡。
我在这个链接Get a screenshot of a window that is cover or not visible or minimized with Xcomposite extension for X11上找到了一个示例,但是我无法使其正常工作,只要我截取屏幕截图,我只得到奇怪的输出,大多数是黑色的,就像我&#39 ; m访问错误的缓冲区或其他东西。
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;
(编辑: 此屏幕截图是从一个完全可见的窗口拍摄的,而不是一个模糊的窗口,所以我猜目前问题甚至不是X11没有画出来但是我的实施似乎不起作用,我无法弄清楚原因。 )
这就是我的konsole窗口的截图:
答案 0 :(得分:3)
首先,Qt有这个功能。您可以使用:QScreen::grabWindow。 问题是文档说:
注意X11,如果给定的窗口没有相同的深度 根窗口,另一个窗口部分或完全遮盖了 你抓住一个,你将不会从上面的窗口获得像素。该 像素图中模糊区域的内容将是未定义的 初始化。
因此,这将简化您的代码,但窗口的模糊部分仍将是一个问题。看起来x11的功能不会让我们解决这个问题。
有一个很好的例子how to use this feature。