获取一个窗口的屏幕截图,该窗口被覆盖或不可见,或者使用Xcomposite扩展插件X11最小化

获取一个窗口的屏幕截图,该窗口被覆盖或不可见,或者使用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

我有下面的开始代码来获得一个X窗口的屏幕截图(窗口可以被覆盖、不可见或最小化)

#包括
#包括
#包括
#包括
#包括
#包括
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!