整个 Windows 桌面的实时视频处理 [关闭]

2023-12-23

我想向整个 Windows 桌面添加动态视频效果。

我希望能够将屏幕变成灰色,将边缘倾斜并添加一些扫描线,使其看起来像旧的 CRT 屏幕,或者使屏幕出现故障,就像他们在不懂技术的电影中展示被黑客入侵的系统一样, ETC。

影响本身超出了这个问题的范围。这个问题是如何应用它们,即如何获取 Windows 生成的桌面图像,应用我的效果并将结果呈现在同一显示器上。

我知道几种可能有效的方法。

  1. 挂钩绘制内容的 WinAPI 调用。
  2. 创建一个假的辅助显示器,使其成为主要显示设备,从中获取视频流,应用我的效果,并在真实显示器上呈现
  3. 创建应用效果的自定义显示驱动程序。

所有这些都有缺点:复杂性、驱动程序签名要求、复杂的设置。有更好的方法来实现我想要的吗?


1 非常难,不同的 API 太多。

2 困难的部分是制作假显示器。如果您购买名为“HDMI 虚拟插头”的 10 美元设备,它将变得相对简单,并且具有 100% 记录的 API。使用桌面复制API获取显示器1的纹理,应用你想要的任何效果并在显示器2上显示。如果你想要良好的性能,你最好完全在GPU上实现处理,例如使用自定义像素着色器渲染四边形。

3 可以,但是很难做到。

还有另一种方法。实现和使用未记录的 API 很棘手,但根据我的经验相当可靠,至少在 Windows 7 上是如此。编写一个将自身注入到 dwm.exe 中的 DLL。这是一个 Windows 进程“桌面窗口管理器”,它组成了桌面上可见的所有内容。 DLL注入后,创建一个新线程,在该线程中调用D3D11CreateDeviceAndSwapChain,然后使用例如MinHook https://github.com/TsudaKageyu/minhook拦截Present,并且理想情况下还ResizeBuffers的方法IDXGISwapChain界面。如果成功,dwm.exe 将在每次呈现框架或桌面分辨率更改时调用 DLL 中的函数。然后,在当前的功能中,您可以做您的事情,例如添加另一个渲染通道来实现您的效果,然后调用原始实现以实际将结果呈现到桌面。

这在理论上很容易,但在实践中实施起来却相当棘手。例如。调试 dwm.exe 很困难,您必须依赖日志记录,或者可能使用带有远程调试器的虚拟机。此外,这也不能跨 Windows 版本移植。另一个限制是,它不适用于视频游戏等全屏应用程序,它们会绕过 dwm.exe。对于视频游戏,仅适用于游戏中的“无边框全屏窗口”设置。

Update:另一种方法,简单得多。创建一个具有每像素透明度的最顶层全屏窗口。操作系统支持它们数十年,设置WS_EX_LAYERED and WS_EX_TRANSPARENT扩展样式位。你将无法进行灰度处理,因为你只能覆盖你的东西,而不能读取下面的内容,但边缘、扫描线和毛刺是完全可行的。为了获得最佳性能,请使用一些以 GPU 为中心的 API 来渲染该窗口,例如C++ 中的 Direct2D 或 D3D。调试起来也更容易,可以使用 2 个显示器,也可以放置透明窗口,使其占据角落的一个矩形,为 IDE 留下足够的屏幕空间。这是一个例子 https://github.com/DmitrySikorsky/StarryNight(不是我的)。

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

整个 Windows 桌面的实时视频处理 [关闭] 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 需要 TensorFlow 依赖项。如何在 Windows 上运行 TensorFlow

    我有兴趣让 TensorFlow 在 Windows 上运行 但目前我意识到这是不可能的 因为某些依赖项无法在 Windows 上使用 例如巴泽尔 之所以出现这种需求 是因为据我目前了解 从 TensorFlow 访问 GPU 的唯一方法是
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐