通过代码,我如何发送硬盘驱动器进入睡眠状态

时间:2009-05-13 23:51:27

标签: c# windows hardware

我的电脑里有很多硬盘(7)。

如果不使用它们,电源选项会在一段时间后让它们进入睡眠状态。 但是因为一切都会产生很多噪音,我想让它们在我想要的时候进入睡眠状态,而不仅仅是在默认的系统超时之后。

在Windows(XP及更高版本)上,最好是在C#中,

如何通过代码将磁盘发送到睡眠状态?

非常感谢您的帮助...

5 个答案:

答案 0 :(得分:1)

我不知道直接执行此操作的API,但有些工具可以执行此操作。我见过的是Hard Disk Sleeper。我没有在我自己的机器上使用它,所以我不能说它的质量或效果。

答案 1 :(得分:1)

如果使用IOCTL_ATA_PASS_THROUGH将ATA命令直接发送到驱动器,则可以执行此操作。您需要传递SLEEP命令。

我不认为这是C#的项目。

答案 2 :(得分:1)

AFAIK,这是一个ATA命令,用于设置*向下旋转时间8 - 这意味着它是关闭的驱动器本身。您可以使用IOCTL_ATA_PASS_THROUGH将命令直接发送到驱动器 - 但是我担心您不会将其设置为某个最小值(我不知道它是什么,但它应该在ATA规范中) )。

修改:看起来像古老的hdparm supports it,所以它必须符合ATA规范:

  

-y   强制IDE驱动器立即进入低功耗待机模式,通常会导致其停止运转。

     

-Y强制IDE驱动器立即进入功耗最低的睡眠模式,使其完全关闭。在再次访问驱动器之前,需要进行硬重置或软重置(如果需要,Linux IDE驱动程序将自动处理发出重置)。

由于hdparm(以及它用于与驱动器通信的底层Linux内核)是GPL - 如果您没有方便的ATA规范,您应该可以从那里获取详细信息。

或者,只需使用win32 port

答案 3 :(得分:0)

老实说,我不认为只使用C#(即.NET框架)就可以做到这一点。

无论如何,我首先要了解WMIACPI

这往往需要您深入研究较低级别的语言(至少要弄清楚要与P \ Invoke一起使用的API调用),因为它通常涉及与操作系统密切交互或可能直接和一个司机。

也许你可以从调查Windows Power Management Functions开始,虽然我认为它不允许控制单个硬盘。

答案 4 :(得分:0)

在Windows上,如果驱动器处于睡眠状态(不旋转),则可以简单地使用“ GetDevicePowerState”函数返回FALSE。

https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getdevicepowerstate