A C# program to control your computer fan speed (Hardware).
原本是打算用wmi的方式来进行调整的,但是wmi的接口只提供了监听而不提供修改的功能。
所以目前是使用OpenHardwareMonitorLib.dll作为接口,其提供了一系列对于设备底层的监控和调整的指令。
由于原软件会导致多实例并存的问题,所以使用了 Mutex 类来确保只有一个实例的程序在运行,Mutex是协调多个线程对共享资源的访问的同步基元。
程序在运行时会尝试创建一个名为 "Global\OHWM_FanControl" 的全局互斥体。如果程序是第一个尝试创建这个互斥体的实例(即 createdNew 为 true),则它获得了互斥体的初始所有权,可以继续执行。 如果之前已经有一个实例在运行,则 createdNew 为 false,并且程序会输出一条消息并返回。
再次运行,新的实例则会通知原有的实例对速度进行轮换的调整。
在主实例界面输入任意值都可以关闭主实例。
原有的程序是通过C#编写的,可执行文件开启管理员权限之后就可以接管对于风扇的控制。
通过C#编写了两个实例分别发送加速和减速的信号,但在运行实例的时候必须同样开启管理员权限。
为了避免每次发送通信信号都需要开启管理员权限的通知,采用了Task Scheduler来绕过UAC的提示。
(目前这一步需要用户自己在任务管理器创建名为fanSlow和fanFast的任务进程)
在function文件夹中的两个C#程序则分别唤醒系统里fanSlow和fanFast的任务,理论上来说是不需要编写exe文件,用vbs文件就可以。 编写exe文件的主要目的在于可以使用第三方程序指定快捷键来运行exe可执行文件,而vbs则不行。
增加了控制水泵速度的功能。
默认为25%(0.9L/min)当风扇转速达到70%以上的时候,水泵速度调整到35%(1.1L/min)。
- 必须将文件部署到本地磁盘,网络连接的磁盘无法启动管理员权限。
- 必须至少有一个主实例运行才能够保持风扇转速的调整。
- 由于硬件设备的性能涉及到管理员权限操作,所以请务必开启管理员权限或以管理员身份运行程序,否则会报错。
- 目前部署之后还需要一定的手动操作来完成自动化设置,后续如果有时间会在继续改进争取一键懒人部署。
编译的部分需要使用VS的命令行来进行:
csc /out:fanSpeedFast.exe fanSpeedFast.cs
或者用dotnet build
和publish
的命令来生成可执行的fast.exe或者slow.exe
Q: 为什么不使用PowerShell或者Shortcut或者cmd?
我个人尝试了这三种情况都会弹出窗口,一闪而过,但理论上来说应该也是可以避免的,不过vbs比较简单就用了。
感谢所有的开源开发者以及OpenHardwareMoniter的制作者和维护者们。