在Windows上使用C++调暗屏幕

10

我一直在研究如何从我的程序中将Windows平台的屏幕调暗。 我知道有一个SetMonitorBrightness API可以实现这一点,但对我来说问题是,希望能够在Windows XP上也能调暗屏幕(该API不支持),并且还可以在桌面计算机上调暗屏幕。

因此,我进行了一些研究,并找到了这个实用程序,它似乎可以在Windows XP桌面上轻松调暗我的屏幕。 我试图联系作者以找出他们如何实现调光,但没有收到回复。

所以,我很想听听这个网站上的开发人员的意见,他们认为该如何在不支持SetMonitorBrightness API的情况下调暗屏幕呢?

PS。 我本人是一名新手开发人员,正试图为我们的小型非营利组织编写一个节能程序。我们没有资金雇用Windows开发人员为我们完成此任务。 由于我们大部分计算机都是Windows XP桌面计算机,因此无法像网络上广泛记录的那样使用SetMonitorBrightness API。

提前致谢。

2个回答

4
在你提到的情况中,可以使用Dependancy Walker查看屏幕保护程序。我猜他们创建了一个全屏窗口,并使用SetLayeredWindowAttributes()函数为窗口设置半透明属性,从而使屏幕变暗。我怀疑这不会节省太多成本。
你可能需要了解DDC协议,它允许你控制一些显示器的方面。可以在这里找到允许你执行此操作的MS API:http://msdn.microsoft.com/en-us/library/windows/hardware/ff570290%28v=vs.85%29.aspx,你还应该查看I2C函数。

或者你可以寻找现成的库来完成DDC相关工作,例如http://www.nicomsoft.com/products/i2c/。他们也有一个免费的调光应用程序供个人使用,商业使用则需要付费。如果您联系他们并解释这是为非营利组织而使用,他们甚至可能允许您免费使用。

如果您试图通过节能计划来实现这一点,为什么不使用屏幕保护设置,在一定时间内的闲置后关闭显示器呢?无论如何


谢谢您的建议。我没有考虑到像您描述的使用SetLayeredWindowAttributes()。但是,显示更暗(更黑)的像素不会要求屏幕使用更少的能量吗? - c00000fd
回答你的问题,为什么我不只是关闭显示器,我们有一种专门的软件输出需要在屏幕上可见的数据,因此我想在N分钟的不活动后调暗屏幕,然后如果操作员移动鼠标,它会恢复到100%。 - c00000fd
@user843732:它可能会使用更少的能量,但你唯一确定的方法是尝试并测量功耗。改变像素的不透明度并不一定会改变背光的亮度,而这正是很多能量消耗的来源。想象一下亮度调高时黑色出现灰色的显示屏。很多LCD屏幕只有一个背光亮度控制,有些是分段的,但几乎没有(没有?)基于每个像素的控制。至于你的应用程序,听起来很有趣。希望你能让它工作。 - tinman
谢谢,tinman。你的解释很有道理。所以你认为节省能源的唯一方法就是降低液晶显示器的背光亮度,对吗?P.S. 显然,在我们得出结论之前,我需要进行测试。 - c00000fd
1
@user843732:我认为这可能是节约能源的主要方式。我发现了这篇文章,它似乎支持LCD显示器的功耗不会因显示的颜色而改变的想法。但由于没有亲自尝试过,我不能确定,因此需要测试。我刚意识到对于CRT或LED显示器来说可能会有所不同,你也可以通过调暗颜色来节省能源。 - tinman
再次感谢提供的信息。这对我来说是一个启示:“使用LCD显示器时,深色稍微消耗更多的电力。”还有一点需要注意:“为了实现最大的节能效果,请勿使用屏幕保护程序,并在计算机闲置时将屏幕变黑。” - c00000fd

3

如果这个信息已经过时了,请原谅我,但是我曾经使用过SetDeviceGammaRamp来实现这个功能。它也有'Get'版本可以用于状态保存和恢复。我曾经在C#程序中看到过它的使用,所以它可能仍然相关,尽管不再常见。


非常好的补充。谢谢!我需要试一下。我唯一的担忧是API的描述中说:“并非所有直接颜色视频板都支持可加载的伽马坡道。” - c00000fd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接