21

是否有 Windows 标准方法可以从 C/C++ 执行“启动风扇”、“降低速度”等操作?

我怀疑它可能是 ACPI,但我是一个虚弱的凡人,无法阅读那种文档。

编辑:例如,Windows 7 允许您在电源计划选项中进行选择,例如“被动冷却”(仅当事情变热时?)与“主动冷却”(保持 CPU 主动冷却?)。似乎操作系统确实有办法控制风扇。

4

5 回答 5

27

我目前正在做一个项目,其中包括控制电脑风扇。基本上,风扇是由你电脑的 superIO 芯片控制的。我们使用端口映射的 IO 直接访问芯片,从那里我们可以访问逻辑风扇设备。使用端口映射 IO 需要代码在内核模式下运行,但 windows 不提供任何通用端口 IO 驱动程序(有充分的理由,因为它是一个非常强大的工具),所以我们编写了自己的驱动程序并使用了它。

如果你想走这条路,你基本上需要两个方面的知识:驱动程序开发以及如何访问和解释 superIO 芯片信息。当我们开始这个项目时,我们对这两个领域都一无所知,所以它一直在通过浏览、阅读和最终做来学习。为了获得知识,我们通过查看这些链接得到了特别帮助:

  1. WDK,即 Windows 驱动程序工具包。你需要它来编译你为 Windows 编写的任何驱动程序,它附带了很多源代码,例如驱动程序,包括一个用于通用端口映射 IO 的驱动程序,称为 portio。
  2. WinIO有 C 语言驱动程序的源代码、以编程方式安装和加载该驱动程序的 C 语言 dll 以及一些用于 GUI 的 C# 代码,用于加载 dll 并读取/写入端口。驱动程序与 portio 中的驱动程序非常相似。
  3. lm-sensors是一个 linux 项目,除其他外,它可以检测您的 superIO 芯片。/prog/detect/sensors-detect 是执行检测的 perl 程序,我们花了一些时间查看代码以了解如何与 superIO 芯片接口。
  4. 当我们检查 lm-sensors 代码时,拥有RapidDriverRW-everything 之类的工具非常好,因为它们允许我们模拟传感器检测的运行。后者功能更强大,对 IO 空间的可视化非常有帮助,而前者提供了对某些操作的更轻松访问,这些操作更好地映射到传感器检测中的操作(读/写字节到端口)
  5. 最后,您需要找到您的 superIO 芯片的数据表。从我所看到的示例中,每个芯片的环境控制器都提供类似的功能(读写风扇速度、读取温度、读取芯片电压),但是您必须写入哪些寄存器才能获得此功能. 这个地方有我们目前需要的所有数据表。
于 2010-06-02T22:44:32.627 回答
4

如果您想要真正快速地将风扇降低到您知道事情不会过热的水平,那么可以使用 speedfan 程序。弄清楚如何在早期版本中配置它以在计算机启动时自动将风扇降低到 50% 非常痛苦,以至于我的第一个方法是简单地对其进行字节修补,以启动我仅有的低速超级管理风扇。较新的版本仍然有点困难,但它是可行的 - 有一个图形滑块系统,看起来像音频均衡器,除了 x 轴是温度,y 是风扇速度。你把它们一一拖下来。在您弄清楚如何手动控制您想要的风扇之后,这是下一步。

有一个使用 C# 监控硬件(如风扇)的项目: http ://code.google.com/p/open-hardware-monitor/

我没有深入研究它,但至少 WinRing0.sys 的源代码和使用给人的印象是,如果你知道你有什么风扇控制器并拥有数据表,它应该可以修改以设置值而不是仅仅获取它们. 我不知道什么工具适合(除了内核调试器)来查看 Speedfan 的功能,如果您更喜欢窥探并模仿 speedfan 而不是查看数据表并尝试一下。

于 2014-01-21T21:53:30.183 回答
2

是的,这将是 ACPI,据我所知,windows 并没有从用户空间对它进行太多/任何控制。因此,您必须开始使用驱动程序,这在 Windows 上几乎是不可能的。

也就是说,谷歌透露有一些针对特定硬件的开源 Windows 库......所以根据你的硬件,你可能会找到一些东西。

于 2009-01-27T21:52:40.517 回答
0

ACPI 可能允许也可能不允许您调整风扇设置。但是,某些 BIOS 实现可能不允许该控制——它们可能会根据 BIOS/CMOS 设置强制控制。在 BIOS 控制(甚至自定义)不足的情况下,可能很难找到一个好的用例。我遇到过 BIOS 控制确实不足的情况,但并非适用于所有可能的主板平台。

于 2009-01-27T22:47:10.657 回答
0

WIndows Management Instrumentation 库 (WMI) 确实提供了Win32_Fan 类,甚至提供了 SetSpeed 方法。唉,文档说这没有实现,所以我想这不是很有帮助。但是您可以通过设置电源状态来控制事物。

于 2009-01-27T23:01:28.960 回答