【问题标题】:How to take screenshot of obscured window in C++ on Linux如何在 Linux 上用 C++ 截取被遮挡的窗口
【发布时间】:2017-02-20 09:34:37
【问题描述】:

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

我在此链接Get a screenshot of a window that is cover or not visible or minimized with Xcomposite extension for X11 上找到了一个示例,但我无法使其正常工作,任何时候我截取屏幕截图时都会得到奇怪的输出,大部分是黑色的,就像我访问错误的缓冲区或其他东西一样.

  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 窗口的屏幕截图的样子:

【问题讨论】:

  • 看起来我没有将任何内容复制到 QPixmap 中。当我创建一个具有一定大小的空 QPixmap 时,我得到相同的输出......

标签: linux qt screenshot x11


【解决方案1】:

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

在 X11 上请注意,如果给定窗口的深度与 根窗口,而另一个窗口部分或全部遮挡 你抓住一个,你不会从覆盖的窗口中得到像素。这 像素图中被遮挡区域的内容将是未定义的,并且 未初始化。

所以这将简化您的代码,但窗口的模糊部分仍然是一个问题。看起来 x11 的功能无法解决此问题。

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

【讨论】:

  • 感谢您指出这一点,尽管我相信这个功能是在 Qt5.0 中引入的,我使用的是 4.8。此外,它并没有解决我的主要问题,即我无法捕获模糊的窗口或框架。只是来自可见窗口的屏幕截图不是问题,我有 WId 并从那里获得窗口位置和大小等窗口属性,我只是在该位置抓取一个矩形,这不是问题。我不确定这对于 X11 是否真的可行,或者我是否必须使用其他东西......
  • 这实际上根本没有回答我的问题。我正在寻找一种解决方案来截取一个被遮挡的窗口,答案说这是不可能的,所以完全误导“像素图中被遮挡区域的内容将是未定义和未初始化的。 ”。
猜你喜欢
  • 2012-08-13
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多