C++ - 如何截屏(某些窗口除外)

2024-02-22

情况:我有一个通过 Internet 执行屏幕共享的软件,其中一个用户充当演示者,其他用户充当观众/与会者。

除了演示窗口之外,演示者还会在屏幕上显示一组非共享窗口(用于开始共享/停止共享等的按钮栏、Skype 窗口等)。

演示者可以通过屏幕共享软件的设置进行配置,使这些非共享窗口不可见(即它们不会出现在发送给与会者的屏幕共享中,但它们后面的窗口内容将出现在屏幕截图中)。

屏幕截图以大约每秒 10 帧或更快的速度发送。

Question:除了这些非共享窗口窗口之外,如何以编程方式捕获屏幕?

Notes:

  • 由于每秒帧数较高,我无法最小化/最大化/设置这些窗口的 Alpha,因为这样窗口就会闪烁。该应用程序是用 Win32 C++ 编写的。
  • 我会使用分层窗口,但由于 Windows 7 桌面合成功能,这无法开箱即用(并且在 Windows 8 中,您不能再使用 DwmEnableComposition 来临时以编程方式禁用合成)
  • 我可以对 Windows XP/2000/7 等使用分层窗口方法,对 Windows 8 使用不同的方法(如果有的话),但我更喜欢在所有系统上运行的单个进程
  • 我还可以尝试通过捕获单个图像(桌面、需要捕获的窗口)并使用它们的 z 索引来创建最终图像来“合成”屏幕截图,但由于所需的每秒帧数值,这个过程会太慢。

在 Windows 中,甚至桌面也被视为窗口并具有自己的 HWND。 然而,仅复制“壁纸”本身似乎并不容易。

所以我基本上看到有两种方法可以做到这一点。 1. 复制整个桌面,例如BitBlt(GetWindowDC(GetDesktopWindow()),...)

OR

  1. Use GetWindow并从桌面窗口开始向后遍历窗口列表,您可以使用 GetDesktopWindow() 确定其 HWND,如下所示:

    // paint on a black DC hwnd=GetDesktopWindow() while (hwnd = GetWindow(hwnd, GW_HWNDPREV)) { // is this window not shared? continue // else bitblt it into our dc }

希望我能给一些启发:-) 如果有人知道如何仅复制桌面而不复制其子窗口,请告诉我。

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

C++ - 如何截屏(某些窗口除外) 的相关文章

  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 使用 AppleScript 运行另一个应用程序而不将其显示在扩展坞上

    使用 AppleScript 您可以创建运行另一个应用程序的脚本 然后将该脚本本身另存为应用程序并将其放置在 Dock 中 问题 不是真正的问题 是 当您单击它时 它仍然会在扩展坞上显示其他应用程序 是否可以阻止其他应用程序在扩展坞中显示
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • JFreechart X和Y轴缩放

    可以在jfreechart中设置轴刻度值吗 例如 我想要 X 轴刻度为 10 Y 轴刻度为 1 您设置了TickUnit 如果您使用的是XYPlot尝试这个 XYPlot plot chart getXYPlot NumberAxis xA
  • 为什么我的一些 HTML 内部链接有效,而另一些则无效?

    救命 我对这个世界完全陌生 我正在首页上制作一个菜单栏 并链接到网站上的其他页面 以下是代码示例 ul li a href About a li li a href The Therapist a li li a href Pay what
  • 视网膜图像中的血管分割

    我正在尝试在视网膜图像中追踪血管 目前我正在使用 cv2 的阈值函数来使血管与周围视网膜的对比度更高 from matplotlib import pyplot as plt import cv2 img cv2 imread misc i
  • 并发 C++ 程序中的可见性

    我知道在 Java 中 从另一个线程访问成员时不能保证成员的可见性 含义是访问线程可能会看到该成员的窃取值 因为缓存尚未刷新到主内存 我想知道C 是否也是如此 也在 C 11 中 如果是这样 你如何在 C 中解决这个问题 在Java中 可以
  • backbone.js 获取缓存的结果

    我在以下backbone js控制器的索引操作中使用fetch App Controllers PlanMembers Backbone Controller extend routes index index function var p
  • Linq 中的多个 WHERE 子句

    我是 LINQ 新手 想知道如何执行多个 where 子句 这就是我想要实现的 通过过滤掉某些用户名来返回记录 我尝试了下面的代码 但没有按预期工作 DataTable tempData DataTable grdUsageRecords
  • PHP $_GET 未从 Web 浏览器填充 URL 查询参数

    我遇到了一个奇怪的问题 GET and REQUEST 变量为空 即使正在传递参数 我的 PHP 代码 echo SERVER REQUEST URI echo print r REQUEST echo print r GET Output
  • MVVM light - 如何访问其他视图模型中的属性

    我正在使用 mvvm light 构建 Silverlight 应用程序 是否有代码片段显示如何从另一个视图模型或用户控件的隐藏代码中访问视图模型的属性或命令 我想这很简单 但我不知何故错过了一些东西 Ueli 您可以使用 Messenge
  • 控制器内的 SignalR 身份验证?

    我正在使用 SignalR 但我似乎无法掌握身份验证来构建用于公共聊天和安全聊天的演示应用程序 有一个聊天室 我想演示经过身份验证的用户将收到公共消息and经过身份验证的用户消息 身份验证是使用现有的 MVC 3 Internet 应用程序
  • 编写无需 requirejs 即可运行的 Requirejs 模块

    我想以某种方式创建我的模块 它们可以与 requirejs 一起使用 也可以不与 requirejs 一起使用 如果没有 require js 它们应该正常工作 所以我必须确保它们正确加载 比如以正确的顺序放置脚本标签 所以 jQuery
  • 你好,我刚刚用 pip 安装了 requests 但无法导入它

    例如我的代码是 import requests r requests get https www python org r status code 结果是 Traceback most recent call last File C Use
  • 添加多个自定义http请求标头之谜

    HttpGet request new HttpGet https 192 168 1 140 8732 我想知道为什么我只能成功发送自定义标头 UserName 和 AuthToken 如果我执行以下操作 request setHeade
  • 使用一些曲线球在 Swing JTextArea 上强制执行最大字符数

    我正在尝试向 Swing JLabel 和 JTextArea 添加功能 以便 用户只能在文本区域输入 500 个字符 最多 标签包含一条字符串消息 告诉用户还剩下多少个字符 每次击键或退格后 当组件初始化时 标签显示 最多 500 个字符
  • 为Android项目创建自己的jar库时出错

    目前我正在研究如何在 Android Studio 中创建 jar 库的基础知识 我跟着如何从 Android Studio 项目中生成 jar https stackoverflow com a 21713954 3022836 and
  • Dagger 2 基类注入

    在 Dagger 1 中 我有一个基类设置 以便它可以处理创建作用域图并将依赖项注入当前对象 例如 public abstract class MyBaseActivity extends Activity private ObjectGr
  • 如何查看通道消费者引发的异常

    我开始使用django channels我觉得这太棒了 然而 调试消费者是痛苦的 因为当消费者内部引发一些异常时 没有任何内容打印到终端 websocket 只是断开连接 未显示的异常类型不易识别 系统地情况是这样的AssertionErr
  • 为 Android 构建 ltrace

    我正在尝试为 Android 构建 ltrace 我尝试了几种方法都没有效果 我能够使用 crosstool ng 的 arm unknown linux gnueabi 生成一个编译源代码的 bin 文件 并且 configure hos
  • PHP json_encode 不会转义所有 JSON 控制字符

    PHP的json encode函数没有转义所有原因吗JSON http www json org 字符串中的控制字符 例如 我们采用一个跨越两行并包含控制字符 r n 的字符串 请注意 回车符和换行符是未转义的 为什么 我使用 jQuery
  • 在迭代列表时将元素添加到列表中。 (Java)[重复]

    这个问题在这里已经有答案了 可能的重复 Java 在迭代期间向集合添加元素 https stackoverflow com questions 993025 java adding elements to a collection duri
  • C++ - 如何截屏(某些窗口除外)

    情况 我有一个通过 Internet 执行屏幕共享的软件 其中一个用户充当演示者 其他用户充当观众 与会者 除了演示窗口之外 演示者还会在屏幕上显示一组非共享窗口 用于开始共享 停止共享等的按钮栏 Skype 窗口等 演示者可以通过屏幕共享