如何在 Linux 上用 C++ 截取被遮挡窗口的屏幕截图

2024-01-07

我正在尝试弄清楚如何截取当前未聚焦的窗口的屏幕截图,因此该窗口很可能会被其他窗口部分或完全遮挡。

我在此链接上找到了一个示例使用 X11 的 Xcomposite 扩展获取被覆盖、不可见或最小化的窗口的屏幕截图 https://stackoverflow.com/questions/21512177/get-a-screenshot-of-a-window-that-is-cover-or-not-visible-or-minimized-with-xcom但我无法让它工作,任何时候我截取屏幕截图时,我都只会得到奇怪的输出,大部分是黑色的,就像我访问了错误的缓冲区或其他东西一样。

  XID xid = windowID;  // Checked and confirmed that the window ID is correct
  XGetWindowAttributes( display, windowID, &attrributes );

  XCompositeRedirectWindow (display, xid, CompositeRedirectAutomatic);

  Pixmap pixmap = XCompositeNameWindowPixmap (display, xid);

  // Extract the data
  XRenderPictFormat *format = XRenderFindVisualFormat (display, attrributes.visual);

  XRenderPictureAttributes pa;
  pa.subwindow_mode = IncludeInferiors;
  Picture picture = XRenderCreatePicture (display, xid, format, CPSubwindowMode, &pa);

  QPixmap finalPix (attrributes.width, attrributes.height);
  XRenderComposite (display, PictOpSrc, picture, None, finalPix.x11PictureHandle(), 0,0, 0,0, 0,0, attrributes.width, attrributes.height);

  XFreePixmap (display, pixmap);
  XCompositeUnredirectWindow (display, xid, CompositeRedirectAutomatic);

  return finalPix;

(Edit: 这个屏幕截图是从一个完全可见的窗口中获取的,而不是一个被遮挡的窗口,所以我想目前的问题甚至不是 X11 没有绘制它,而是我的实现似乎不起作用,我不明白为什么。)


首先Qt有这个功能。您可以使用:QScreen::抓取窗口 http://doc.qt.io/qt-5/qscreen.html#grabWindow。 问题是文档说:

请注意,在 X11 上,如果给定窗口的深度与 根窗口,另一个窗口部分或完全遮挡 当你抓取一个窗口时,你不会从上面的窗口中获得像素。这 像素图中被遮挡区域的内容将是未定义的并且 未初始化。

因此,这将简化您的代码,但窗口的模糊部分仍然是一个问题。看起来 x11 的功能无法解决这个问题。

有一个很好的例子如何使用此功能 http://doc.qt.io/qt-5/qtwidgets-desktop-screenshot-example.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Linux 上用 C++ 截取被遮挡窗口的屏幕截图 的相关文章

  • 在 Qt 中,许多插槽连接到同一信号,它们在发出信号时是否按顺序调用?

    In the Qt文件说 如果多个插槽连接到一个信号 则这些插槽将 按照它们连接的顺序一个接一个地执行 当信号发出时 但在connect 功能 设置Qt ConnectionType输入为Qt QueuedConnection意思是 当控制
  • 如何将 QFile 与 std::iostream 一起使用?

    是否可以像 std iostream 一样使用 QFile 我很确定那里一定有一个包装纸 问题是在哪里 我有另一个库 它需要 std istream 作为输入参数 但在我的程序中 此时我只有一个 QFile 我使用以下代码提出了自己的解决方
  • 如何阻止ubuntu在使用apt安装或更新软件包时弹出“Daemons using outdatedlibraries”? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我最近新安装了 Ubuntu 22 04 LTS 我发现每次使用 apt 安装或更新软件包时 它都会询问我有关Which servic
  • 使用Python选择屏幕区域

    我正在用 Python 开发一个屏幕截图实用程序 目前它是专门针对 Linux 的 到目前为止 我已经能够拍摄完整桌面的屏幕截图 并将其上传到 Imgur 然后将链接复制到剪贴板 现在我想扩展到诸如活动窗口或特定选择的屏幕截图之类的功能 如
  • 使 QLabel 的像素图透明

    我有一个带有 QLabel 和像素图的主窗口 我想让它透明 或不那么不透明 我正在使用下面的代码 ui gt label gt setAttribute Qt WA TranslucentBackground ui gt label gt
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • CMake AUTOMOC,文件位于不同文件夹中

    我有一个简单的 CMake 项目 proj project folder a h a cpp CMakeLists txt CMakeLists txt cmake minimum required VERSION 3 2 set CMAK
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • QByteArray 到整数

    正如您可能从标题中看出的那样 我在转换QByteArray为一个整数 QByteArray buffer server gt read 8192 QByteArray q size buffer mid 0 2 int size q siz
  • 如何为 Windows 安装开源 Qt 库 5 二进制版本

    这个问题具体是关于Qt libraries 5 0 0 for Windows VS 2010 406 MB at http qt project org downloads http qt project org downloads 但我
  • 如何查找哪个 Yocto 项目配方填充图像根文件系统上的特定文件

    我经常与 Yocto 项目合作 一个常见的挑战是确定文件为何 或来自什么配方 包含在 rootfs 中 这有望从构建系统的环境 日志和元数据中得出 理想情况下 一组命令将允许将文件链接回源 即配方 我通常的策略是对元数据执行搜索 例如gre
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • Qt 5.3 QPlainTextEdit 更改 QTextCursor 颜色

    我想更改下面的光标颜色QPlainTextEdit小部件 我能够将其宽度设置为6 但我想改变颜色或者它 是否可以 QFontMetrics fm font setCursorWidth fm averageCharWidth setCurs
  • QWebEngineView 在 load() 或 page() 方法上崩溃

    我正在致力于将 Qt 5 5 QWebView 项目移植到 Qt 5 6 测试版 QWebEngine 我已经阅读了移植指南here https wiki qt io Porting from QtWebKit to QtWebEngine
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐

  • 插入项目或将它们添加到排序列表后对列表进行排序是否更快

    如果我有一个排序列表 比如快速排序来排序 如果我有很多值要添加 那么最好暂停排序 并将它们添加到末尾 然后排序 或者使用二进制排正确地放置项目 同时添加它们 如果项目是随机的 或者已经或多或少按顺序排列 会有什么不同吗 如果您添加了足够的项
  • Python串口监听器

    我已经开始使用 PySerial 编写一些代码来向串行设备发送和接收数据 到目前为止 我只致力于从终端启动事务并接收来自串行设备的响应 pseudo main loop message get message send to serial
  • 如何使用 psql 命令行界面显示表中的数据?

    有没有办法使用 psql 命令行界面显示表中的所有内容 我可以用 list显示所有数据库 d显示所有表格 但是如何显示表格中的所有数据呢 较新版本 从 8 4 发行说明中提到 https www postgresql org docs re
  • android proguard,跳过jar

    我想知道是否可以跳过 proguard 中的 jar 以便它不会混淆它们 我正在尝试使用以下命令来做到这一点 libraryjars myjar jar 但我的代码一直存在问题 我正在尝试导出一个具有适用于 Android 的 javama
  • 有番石榴概述吗?

    Guava 库很强大 但我不确定这个库的所有可能性是什么 我发现了一些有趣的教程 例如http scaramoche blogspot com search label guava http scaramoche blogspot com
  • 如何修复响应式数据表的最后一列

    我有一个数据表 最后一列是两个按钮 我正在实现响应式数据表 但我需要最后一列 列 Opciones 不隐藏 并且始终显示 无论其他列如何 如果您需要更多信息 请告诉我 HTML ASP NET 视图 model PagedList IPag
  • Azure DevOps - 自定义构建任务可见性

    我正在学习 Azure DevOps 我有兴趣创建一个自定义构建任务 https learn microsoft com en us azure devops extend develop add build task view vsts
  • 计算两个字符串之间的差异

    我试图计算两个导入的字符串 seq1 和 seq2 导入代码未列出 之间的差异数量 但在运行程序时没有得到任何结果 我希望输出显示为 2 个差异 之类的内容 不知道我哪里错了 def difference seq1 seq2 count 0
  • 计算另一个模型 Django 的点赞数

    实现一个用户可以喜欢宠物的相似模型 如果用户按下like isLike将为true 而like则为true isLike为false 模型 class pet models Model name models CharField max l
  • 如何将 printf 的输出存储在变量中并格式化? [复制]

    这个问题在这里已经有答案了 我想存储的输出printf在变量中进行格式化 但由于某种原因它删除了格式化 这是正确的输出 printf 40s 8s 9s 7s File system Free Refquota Free File syst
  • 如何使用 jQuery 动态地从具有相同名称的多个输入、输入字段中获取值?

    我想通过单击按钮动态添加金额 数量 小计字段作为发票项目 但问题是当我想获得的价值quantity and amount每次计算输入字段值时 由于 id 名称相同 我无法使用 jquery 获取该值 如何获取动态字段值来计算小计 这是代码
  • Zoomooz ZoomContainer 移开

    我正在尝试使用 Zoomooz jquery mouse wheel 和 jquery kinetic js 在表单设计器中实现自由拖动 滚动功能的缩放 这是该功能的演示 http jsfiddle net mVf8Z http jsfid
  • 将输入流转换为文件输入流

    我读过这篇文章如何将InputStream转换为FileInputStream https stackoverflow com questions 2353057 how to convert inputstream to fileinpu
  • 从 Google 趋势下载 .csv 文件

    我希望从我通过代码创建的网址下载 Google 趋势数据 这些 URL 当放入浏览器 我使用 Firefox 时会显示一个保存提示 我可以在浏览浏览器时选择打开或保存文件 但是 我希望通过代码获得包含 Google 趋势数据的同一个 csv
  • Python IDLE 相当于 R 中的 CTRL-R

    如果您在 Windows 版本的 R 中打开了一个脚本 则可以通过按 CTRL R 相信在苹果版本中是 command enter 在 shell 中运行一行 或突出显示的代码部分 IDLE 有类似的功能吗 非常感谢 No 在IDLE的快捷
  • Scala:如何按元组的第一个元素合并列表

    假设我有一个清单 A a A b A c B a B d 我如何将该列表变成 A a b c B a d 具有单一功能 Thanks The groupBy http www scala lang org api 2 12 x scala
  • 真正删除 XMLParser Object Groovy 中的节点

    如何通过 XMLParser 真正删除节点 x
  • 如何处理 Camel FTP 的“主机尝试数据连接 x.x.x.x 与服务器 y.y.y.y 不同”错误?

    我正在尝试使用 Camel FTP Producer 将文件发送到第三方 ftp 服务器 似乎由 Amazon 托管 并且遇到了一个问题Writing File failed with File operation failed Host
  • kubectl 仅获取 pod 的事件

    当我跑步时kubectl n abc namespace describe pod my pod zl6m6 最后我得到了很多关于 pod 以及事件的信息 有没有办法只输出 pod 的事件kubectl describe or kubect
  • 如何在 Linux 上用 C++ 截取被遮挡窗口的屏幕截图

    我正在尝试弄清楚如何截取当前未聚焦的窗口的屏幕截图 因此该窗口很可能会被其他窗口部分或完全遮挡 我在此链接上找到了一个示例使用 X11 的 Xcomposite 扩展获取被覆盖 不可见或最小化的窗口的屏幕截图 https stackover