如何在 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++ 截取被遮挡窗口的屏幕截图 的相关文章

  • 如何在linux中使用iptables将http和https流量转发到透明代理[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 当给定 100k 项时,QListView 需要很长时间才能更新

    我在读取文件时遇到问题 具体是我想制作一本小字典 在我需要阅读的文件中有这样的内容 a Ph P6 a snsr CA a b c fb Dj a b c book i BS A except B gate oOPa y a font kQ
  • Nightmare.js 截图缓冲区长度 0

    我正在运行一个 night js 脚本 我试图在其中截取页面上多个元素的屏幕截图 The first元素被捕获得很好 但折叠下方的所有其他元素都以零长度捕获 我正在努力调试这个问题 任何帮助将非常感激 基本上这个脚本会遍历一个页面并选择al
  • 如何通过信号和槽传递参数?

    我的 GUI 包括LineEdit and a 按钮 当 的时候按钮单击后 插槽clicked 叫做 我想在之间建立信号槽关系clicked 作为信号和doSomething 作为插槽 问题是doSomething 无权访问 UI 并且do
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • 隐式声明“gets”

    据我所知 隐式声明 通常意味着该函数必须在调用之前放置在程序的顶部 或者我需要声明原型 然而 gets应该在stdio h文件 我已包含 有没有什么办法解决这一问题 include
  • 如何通过不同的接口路由 TCP/IP 响应?

    我有两台机器 每台机器都有两个有效的网络接口 一个以太网接口eth0和 tun tap 接口gr0 目标是使用接口在机器 A 上启动 TCP 连接gr0但然后让机器 B 的响应 ACK 等 通过以太网接口返回 eth0 因此 机器 A 发出
  • 如何从键盘为 QTableWidget 创建信号?

    我有一张桌子 可以通过左 右 上 下按钮在里面移动 现在 当我停留在某个单元格并按空格键时 我需要创建一个信号 该信号还应该带来该单元格的坐标 我尝试使用 QTableWidget 的标准信号 但它不起作用 我该如何解决这个问题 创建一个单
  • 更改 Qt 中的语言环境

    我尝试使用 QLocale 和 setDefault 函数更改区域设置 但似乎不起作用 以下是使用 C 本地化库和 QLocale 更改语言环境的示例 对于 C 本地化库 它似乎可以工作 但对于 QLocale setDefault 函数调
  • 当在 python linux 中执行命令 os.system() 时,在 python 中给出响应 yes/no

    考虑一个像这样的命令 yum install boto 当我在终端中执行时 要继续 会询问我是 否 我可以像这样用 python 回应它吗 os system yum install boto Next Yes 将通过相同的 python
  • Qmake 不支持源目录下的构建目录

    我创建了一个可以在 OS X 上编译和运行的应用程序 我现在想开始让它在 Windows 上运行 首先 我将项目复制到 Windows 机器上并尝试编译 但收到此错误 警告 Qmake不支持源目录下的构建目录 有任何想法吗 将影子构建目录设
  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • 有没有办法提高linux管道的性能?

    我正在尝试使用 64 位将超高速数据从一个应用程序传输到另一个应用程序CentOS http en wikipedia org wiki CentOS6 我使用以下方法进行了基准测试dd发现阻碍我的是管道而不是程序中的算法 我的目标是达到
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • Linux 中的 Windows NAmed Pipes 替代品

    我们正在将现有的 Windows 代码移植到 Linux 我们使用 ACE 作为抽象层 我们使用 Windows 命名管道与多个客户端进行通信并执行重叠操作 linux 下这个相当于什么 我检查了linux命名管道 FIFO 但它们似乎只支
  • 在 Qt 中创建/写入新文件

    我正在尝试写入文件 如果该文件不存在 则创建它 我在互联网上搜索过 但没有任何效果 我的代码目前看起来像这样 QString filename Data txt QFile file filename if file open QIODev
  • 在 MacOS 上构建需要 net461 的 dotnet SDK 项目的最简单方法

    我有一个 dotnet SDK sln and a build proj with
  • 用Java截取网页的屏幕截图[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有一个免费的工具可以读取给定的网页并截取它的屏幕截图 我使用 VirtualFramebuffer 和 Firefox Binary
  • 虚拟内存澄清——大连续内存的分配

    我有一个应用程序 我必须在 Windows 上分配 使用运算符 new 相当大的内存空间 数百 MB 该应用程序是 32 位 我们现在不使用 64 位 即使在 64 位系统上也是如此 我启用了 LARGEADDRESSAWARE 链接器选项
  • 使用 Python 将阿拉伯语或任何从右到左书写系统的字符串打印到 Linux 终端

    非常简单的例子是 city print city 我期望输出是 但实际上输出是相反的字符串 字母看起来有点不同 因为它们有开始 中间和结束形式 我无法将其粘贴到此处 因为复制粘贴会再次更正字符串的顺序 如何在 Linux 终端上正确打印阿拉

随机推荐

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

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