好吧,我想知道..也许其他人也是.
是否可以通过编程在屏幕上单独控制每个像素,尤其是C或C++?
您是否需要对当前屏幕的驱动程序进行特殊控制?是否有允许您更改像素的操作系统(例如在所有内容上绘制消息/覆盖图)?
或者Windows支持这可能在它的WinApi?
编辑:
我问这个问题,因为我想让我的电脑在游戏时警告我,而我的处理器太热了.我主要使用Windows,但我有一个双启动ubuntu发行版.
你去的越低,你遇到的麻烦就越多.
如果你想要原始像素操作,你可以查看http://www.libsdl.org/,它可以帮助你减轻创建表面/窗口和那种东西的麻烦.
Linux有一些方法可以让你更低,如果你想要(即没有"windows"或"xwindows"或任何类型的东西,只是原始屏幕),如果你对此感兴趣,请查看Linux Frame Buffer.
降低甚至更低(例如使用自己的操作系统处理),BIOS会让你进入某些视频模式,这是操作系统安装人员倾向于使用的(至少他们曾经使用过,一些更高级的人不再使用) .这不是最快的做事方式,但可以让你进入一些装配说明中显示像素的领域.
当然,如果你想做自己的操作系统并利用视频卡(绕过BIOS),你就是在谈论编写视频驱动程序等等,这显然是一项大量的工作:)
重新覆盖屏幕顶部的消息和那种东西,windows确实支持这种事情,所以我确信你可以用WinAPI来做,尽管有可能的库可以使这更容易.我知道你不需要深入研究这种事情.
让我们逐一查看:
是否可以通过编程(尤其是C或C++)来单独控制屏幕上的每个像素?
可能吧。它实际上取决于图形架构,并且在许多现代系统中,实际的屏幕表面(即“屏幕上出现的一堆像素”)并不直接受软件控制 - 至少不是来自“用户模式”(即,来自您或我可以编写的应用程序 - 您需要编写驱动程序代码,并且需要与现有的图形驱动程序充分合作)。
人们普遍认为,将数据绘制到离屏缓冲区中并使用 BitBlt [BitBlockTransfer] 函数将内容复制到屏幕上是执行此类操作的首选方法。
因此,实际上,您可能无法操纵屏幕上的每个像素 - 但您可能能够像您一样显示。
您是否需要对当前屏幕的驱动程序进行特殊控制?
假设您可以直接访问屏幕内存,您的代码肯定必须与驱动程序合作 - 否则,谁能说您想要在屏幕上显示的内容不会被其他内容覆盖[例如您想要完整的内容]屏幕访问,时钟更新程序在您绘制的内容之上每分钟更新一次屏幕上的时间,等等]。
您也许可以将驱动程序设置为一种模式,其中有一个“洞”,允许您将屏幕内存作为大“帧缓冲区”进行访问。我认为在 Windows 中没有简单的方法可以做到这一点。我不记得 2003 年至 2005 年期间的任何事情,当时我以编写图形驱动程序为生。
是否有允许您更改像素的操作系统(例如在所有内容之上绘制消息/叠加层)?
在现代显卡的硬件中创建覆盖层是绝对可能的。这通常是视频播放的工作原理 - 视频播放到覆盖在其他图形之上的一块帧缓冲内存中。您需要驱动程序的帮助,据我所知,这肯定可以在 Windows API 中通过 DirectX 获得。
或者 Windows 的 WinApi 是否支持这一点?
可能吧,但为了准确回答,我们需要更好地了解您想要做什么。
编辑:在您的特定用例中,我认为发出声音或弹出 CD/DVD 驱动器可能是更合适的选择。在游戏绘制的图形上覆盖某些内容可能很困难,因为游戏通常会尝试使用尽可能多的可用图形资源,并且您可能很难找到一种即使对于大多数人也适用的方法。简单的用例 - 不要介意使用不同的绘图/引擎/图形库适用于多种不同类别的游戏的东西。我也不完全确定这是否值得过度担心,因为现代 CPU 对过热的容忍度相当高,因此 CPU 只会变慢,甚至可能停止运行,但它不会损坏 - 即使您取下散热器,不会出错的【不,我不建议你尝试这个!】