如何在Linux上用C ++获取模糊窗口的截图

时间:2016-10-11 18:22:56

标签: linux qt screenshot x11

我试图弄清楚如何拍摄当前没有聚焦的窗口的屏幕截图,因此窗口很可能被其他窗口部分或完全遮挡。

我在这个链接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窗口的截图:

The resulting screenshot

1 个答案:

答案 0 :(得分:3)

首先,Qt有这个功能。您可以使用:QScreen::grabWindow。 问题是文档说:

  

注意X11,如果给定的窗口没有相同的深度   根窗口,另一个窗口部分或完全遮盖了   你抓住一个,你将不会从上面的窗口获得像素。该   像素图中模糊区域的内容将是未定义的   初始化。

因此,这将简化您的代码,但窗口的模糊部分仍将是一个问题。看起来x11的功能不会让我们解决这个问题。

有一个很好的例子how to use this feature