如何使用Xlib将一个窗口的内容复制到另一个窗口?

3
我想使用Xlib将现有窗口的内容复制到我的窗口中。我已经尝试过XCopyArea,但它拒绝在两个窗口之间进行复制。我还尝试过XGetImage和XPutImage,但也失败了。
最好的方法是什么,可以将窗口的图形内容复制到我的窗口中?
基于以下信息,我能够让XCopyArea和XGetImage工作。它没有起作用的原因是源窗口和目标窗口的深度不同。我很惊讶地发现,我的桌面上的不同窗口具有不同的深度。
但是,我在使用XCopyArea时仍然有限的成功。如果我从某些窗口的顶部(如Google Chrome)开始复制,它并不会复制整个区域,只会复制标题栏。在这些情况下,XGetImage正常工作。您知道为什么XCopyArea无法复制一些窗口的标题栏以外的区域吗?
1个回答

4

XCopyArea应该是可以的。 注意,这只会复制到目标前景 - 也许正在绘制然后擦除?

没有代码我只能猜测:

如果失败了,你是否检查过窗口是否确实具有相同的根和深度? 还要确保您查看 X 窗口坐标系统。尝试将复制的角落放在目标的中心,看看是否可以得到任何东西。

通常希望通过 Expose 事件处理源窗口,以便进行刷新。

我建议创建一个 Pixmap 作为中间件。Pixmap 和 Window 都是 Drawable。 使用 XCopyArea 将其复制到 Pixmap 中。 然后使用XSetWindowBackgroundPixmap来实际渲染图像。设置背景意味着您可以忽略重新绘制图像的任何需要处理 Expose 事件。


1
另一种让人困惑的方式是期望一个被遮挡/未映射的源窗口具有有意义的内容。(slowpoison,描述一下你所说的“失败”是什么意思 - X错误?什么也没发生?等等) - Havoc P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接