xcb_get_image_reply在另一个工作空间/桌面上的窗口失败

时间:2019-06-12 12:58:03

标签: c++ ubuntu x11 xlib xcb

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 encodingsgeneral XCB errors explanation,则会收到错误消息,描述为:

  

匹配:“仅输入”窗口用作“可拖动”。在图形请求中,GCONTEXT参数的根和深度与目标DRAWABLE参数的根和深度不同。某些参数(或一对参数)具有正确的类型和范围,但无法以请求所需的其他方式进行匹配。

但是我不知道该怎么办。

注意:如果两个应用程序都在同一虚拟桌面上,则上述解决方案可以正常工作。

1 个答案:

答案 0 :(得分:0)

引用https://www.x.org/releases/X11R7.6/doc/xproto/x11protocol.html#requests:GetImage

  

如果可绘制对象是一个窗口,则该窗口必须是可见的,(或出现匹配错误)。

因此,GetImage请求失败,因为要截屏的窗口不可见。 X11服务器不会(真正)保留屏幕上可见内容以外的任何内容。其他所有内容都不会保存在任何地方。

  

我想获取放置在另一个虚拟桌面上的应用程序的屏幕截图。

基本上:X11无法做到这一点,除了切换到其他虚拟桌面之外,等到相关窗口重新绘制(如何?),然后抓取屏幕截图。