获取一个窗口的屏幕截图,该窗口被覆盖或不可见,或者使用Xcomposite扩展插件X11最小化
我有下面的开始代码来获得一个X窗口的屏幕截图(窗口可以被覆盖、不可见或最小化)获取一个窗口的屏幕截图,该窗口被覆盖或不可见,或者使用Xcomposite扩展插件X11最小化,c,linux,screenshot,x11,xlib,C,Linux,Screenshot,X11,Xlib,我有下面的开始代码来获得一个X窗口的屏幕截图(窗口可以被覆盖、不可见或最小化) #包括 #包括 #包括 #包括 #包括 #包括 int 主要() { Display*Display=XOpenDisplay(空); XID-XID=90177543;//xdool搜索——名称“魔兽世界”| head-1 //检查是否启用了复合扩展 int事件\基本\返回; int error\u base\u返回; if(XCompositeQueryExtension(显示、事件基本返回和错误基本返回)) p
#包括
#包括
#包括
#包括
#包括
#包括
int
主要()
{
Display*Display=XOpenDisplay(空);
XID-XID=90177543;//xdool搜索——名称“魔兽世界”| head-1
//检查是否启用了复合扩展
int事件\基本\返回;
int error\u base\u返回;
if(XCompositeQueryExtension(显示、事件基本返回和错误基本返回))
printf(“复合已启用!\n”);
//请求X服务器将从窗口开始的层次结构定向到屏幕外存储
XCompositeDirectWindow(显示、xid、CompositeDirectAutomatic);
//当窗口被隐藏/破坏时,防止释放备份pixmap
//如果希望在销毁窗口后窗口内容仍然可用,
//或者在调整窗口大小(但尚未重新绘制)后,可以增加支持
//pixmaps ref计数,以防止其被释放。
Pixmap Pixmap=XCompositeNameWindowPixmap(显示,xid);
//获取窗口属性
xwindowattr;
状态s=XGetWindowAttributes(显示、xid和属性);
如果(s==0)
printf(“无法获取窗口属性!\n”);
//提取数据
XRenderPictFormat*format=XRenderFindVisualFormat(显示,属性视觉);
int width=attr.width;
整数高度=属性高度;
int depth=attr.depth;
//我们现在需要做的是为窗口创建XRender图片,
//我们需要使用渲染扩展来绘制它。
//图片基本上是服务器端结构的句柄,带有一些
//有关可绘图的其他信息(在本例中为窗口),
//例如它的格式,使用时应该使用哪个剪辑区域
//绘制图纸(如有),是否应平铺等。
XrenderPictureA;
pa.subwindow_mode=包含中间层;
图片图片=XRenderCreatePicture(显示、xid、格式、CPSubwindowMode和pa);
//我们现在拥有了绘制窗口所需的所有信息
//使用Xrender扩展,我们已经创建并准备了一张源图片
//为了达到这个目的,我把它放在窗户上。
//我们将用于绘制窗口的Xrender函数是XRenderComposite()。
//XRenderComposite(显示、PictOpSrc、图片、无、目的地、0,0、0,0、宽度、高度);
XFreePixmap(显示,pixmap);
XCompositeUnreDirect窗口(显示、xid、CompositeDirectAutomatic);
返回0;
}
[使用gcc file.c-lX11-lXcomposite-lXrender编译代码,并使用/a.out运行
]
[您可以使用命令xdool search--name“Title of a window”| head-1
]获取桌面窗口的有效XID]
现在我有两个问题:
调用XRenderFindVisualFormat
函数时,出现BadMatch(无效参数属性)
错误。我不知道为什么。存在具有XID 90177543的窗口
我不知道如何获取图片
的缓冲区以将其保存为PNG图像。我不想用QT库来做这件事
您能帮我吗?我可以按如下方式重现您的错误:
$ ./xidtest
COMPOSITE IS ENABLED!
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 142 (Composite)
Minor opcode of failed request: 1 ()
Resource id in failed request: 0x5600007
Serial number of failed request: 9
Current serial number in output stream: 12
当使用我知道存在的窗口id(0x440000B或71303179,使用xwininfo找到)进行设置时,我没有收到任何错误:
$ ./xidtest
COMPOSITE IS ENABLED!
我认为错误在于您提供的窗口id无效。1。请在未经编辑的情况下完整发布您收到的错误消息(主要操作码等)。2.使用libpng
.2)使用XGetImage获取像素的像素。如果您的图片已经有了与之关联的pixmap,只需使用该pixmap,否则使用XRenderComposite在另一个pixmap上绘制图片内容,然后在该pixmap上使用XGetImage是的,我可以使用libpng,但图片是一个XID,我如何获得此图片的缓冲区以与libpng一起使用?抱歉,我误读了您的第二个要点。要获得像素,就像@AndreySidorov所说的那样,使用libpng保存像素。
$ ./xidtest
COMPOSITE IS ENABLED!