【问题标题】:xcb_get_image_reply fails for window on another workspace/desktopxcb_get_image_reply 在另一个工作区/桌面上的窗口失败
【发布时间】:2019-06-12 12:58:03
【问题描述】:

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 我得到错误描述为:

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

但我不知道该怎么处理。

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

【问题讨论】:

    标签: c++ ubuntu x11 xlib xcb


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 太可惜了。这也可以解释为什么当系统启用锁屏时它不起作用。
    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多