Ubuntu(xfce)提供虚拟桌面(也称为工作空间)。我想获取放置在另一个虚拟桌面上的应用程序的屏幕快照。我成功创建了xcb连接,并且可以通过其标题找到应用程序窗口。问题是xcb_get_image_reply
失败。我做这样的事情:
auto cookie = xcb_get_image(m_XCBConnection, XCB_IMAGE_FORMAT_Z_PIXMAP, m_XCBWindow, x, y, width, height, ~0);
xcb_generic_error_t * err = nullptr;
auto image = xcb_get_image_reply(m_XCBConnection, cookie, &err);
// xcb_connection_has_error( m_XCBConnection ) returns no error
if ( err ) {
// here I have err->error_code == 8
free( err );
}
如果我正确理解XCB errors encodings和general XCB errors explanation,则会收到错误消息,描述为:
匹配:“仅输入”窗口用作“可拖动”。在图形请求中,GCONTEXT参数的根和深度与目标DRAWABLE参数的根和深度不同。某些参数(或一对参数)具有正确的类型和范围,但无法以请求所需的其他方式进行匹配。
但是我不知道该怎么办。
注意:如果两个应用程序都在同一虚拟桌面上,则上述解决方案可以正常工作。
答案 0 :(得分:0)
引用https://www.x.org/releases/X11R7.6/doc/xproto/x11protocol.html#requests:GetImage:
如果可绘制对象是一个窗口,则该窗口必须是可见的,(或出现匹配错误)。
因此,GetImage请求失败,因为要截屏的窗口不可见。 X11服务器不会(真正)保留屏幕上可见内容以外的任何内容。其他所有内容都不会保存在任何地方。
我想获取放置在另一个虚拟桌面上的应用程序的屏幕截图。
基本上:X11无法做到这一点,除了切换到其他虚拟桌面之外,等到相关窗口重新绘制(如何?),然后抓取屏幕截图。