【问题标题】:Make entire screen monochrome and other full screen effects制作全屏单色等全屏效果
【发布时间】:2011-01-27 20:13:03
【问题描述】:

有谁知道如何用 c# 或任何编程语言将效果应用于整个屏幕。 我最感兴趣的是使屏幕成为单色(特别是绿白而不是黑白色)。

我知道跨显卡解决方案是可行的,因为我找到了一个可以做到这一点的程序: http://www.freedomscientific.com/products/lv/magic-bl-product-page.asp

任何人都知道如何完成此任务或在哪里查看?

谢谢!!

【问题讨论】:

  • 是什么让您认为您链接的软件是跨平台的?我所能看到的只是对各种 Windows 版本的引用。
  • 我的立场是正确的。我的意思是它适用于不同版本的 Windows,跨平台的表述非常糟糕。
  • 您可能需要创建一个驱动程序或申请Wide System Hooks...这不会是特别简单的托管代码。
  • 宽系统挂钩,非常有趣的主题。我将对此进行调查。

标签: c# fullscreen effects monochrome


【解决方案1】:

没有简单的 Windows API 可以修改整个屏幕内容。但这可以在设备驱动程序级别完成。

否则你必须求助于一些 Windows API 技巧:在整个桌面上放置一个“假”窗口,循环:抓取整个屏幕内容而不抓取假窗口内容,进行处理以获得单色效果,然后将其显示在假窗口上。是的,它既笨拙又慢,但有可能。更骇人听闻的是,当您单击鼠标“通过”假窗口时(大量 SetWindowsRgn 调用)。

因此,这里的跨平台意味着使用 GDI,尽管一些较旧的 DirectDraw API 可能有效,但在这种情况下,您可以更轻松地使用硬件覆盖(以及更好的性能)。虽然我不确定有多少卡实际支持硬件覆盖,以及新版本的 Windows 是否支持旧的 DirectDraw API。

另一种可能性是,如果视频卡具有 C# 或 C++ 或 C API,那么您可以对卡做任何您想做的事情,而无需编写设备驱动程序代码。

然后是 CUDA,但我还没有尝试过。我知道它用于在 nVidia 板上进行流处理,但我想知道它是否可以让你轻松进入视频显示的后门。

【讨论】:

  • 你说的设备驱动级别。你能指出我在哪里可以找到有关与之交互的更多信息吗?是的,我也在考虑“假窗口”解决方案,但由于没有直接的方法可以在活动窗口“下方”截取屏幕截图,我将不得不使用一个循环来隐藏活动窗口,拍摄并显示再次,这将导致可怕的闪烁。感谢其他建议和头脑风暴!
  • 我从来没有写过设备驱动程序,所以我不能给你任何真正的建议。对于闪烁的“假”窗口,有一个 GDI 技巧,假窗口具有 99% 的不透明度,然后您使用不带 CAPTUREBLT 标志的 BitBlt(基本屏幕捕获)。这会导致屏幕捕获错过任何具有透明度的窗口。对丢失假窗口有好处,对丢失真实窗口内容不利。
  • 我听说过这个解决方法。但这也适用于 Windows 7 吗?因为毕竟设计不是这样的?
  • 是的,每一个小技巧实际上都是官方 Windows API 的一部分,但是为了这个特殊的特性把它们串在一起感觉很笨拙,因为你真正想要这个特性是有一个好的,友好,可靠,高性能的API,可以根据需要修改屏幕内容,无需编写驱动程序。
  • 有了这些小技巧在Vista/Win7 中行得通吗?可能,但我敢打赌,由于 DWM,他们会有一些古怪的行为或者可能存在额外的性能问题。要尝试的一件事是 Microsoft IntelliPoint 软件中的“放大镜”功能,它是免费的,但需要 MS 品牌的鼠标。在 Vista/Win7 上,这个放大镜肯定有一些绘图问题,但仅限于某些系统。
【解决方案2】:

为了帮助未来对此感兴趣的人:

Magnification API's color effect method 可以做到这一点。这允许人们使用可以应用于整个屏幕的矩阵。

NegativeScreen 是一个开源项目,它实现了您在 C# 中描述的功能。

不幸的是,这仅适用于仿射变换,因为 API 仅采用增强矩阵而不是委托或其他东西。

【讨论】:

    猜你喜欢
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2010-12-03
    • 1970-01-01
    相关资源
    最近更新 更多