如何以编程方式防止Windows硬盘驱动器停止运转?

use*_*591 9 windows delphi winapi hard-drive

我的程序在硬盘可用空间上执行任务.任务很长,需要1-2个小时.

问题是,在笔记本电脑上,当用户处于非活动状态时,硬盘可能会在几分钟后关闭.

如何以编程方式防止Windows硬盘关闭(关闭电源)?

TLa*_*ama 9

要防止系统进入空闲模式,您可以尝试使用该SetThreadExecutionState功能.此函数通知系统应用程序正在使用中,并允许您指定线程的执行要求.用法可以是这样的,但我不确定这是否也会影响磁盘断电计时器:

type
  EXECUTION_STATE = DWORD;

const
  ES_SYSTEM_REQUIRED = $00000001;
  ES_DISPLAY_REQUIRED = $00000002;
  ES_USER_PRESENT = $00000004;
  ES_AWAYMODE_REQUIRED = $00000040;
  ES_CONTINUOUS = $80000000;

function SetThreadExecutionState(esFlags: EXECUTION_STATE): EXECUTION_STATE;
  stdcall; external 'kernel32.dll' name 'SetThreadExecutionState';

procedure TForm1.Button1Click(Sender: TObject);
begin
  if SetThreadExecutionState(ES_CONTINUOUS or ES_SYSTEM_REQUIRED or
    ES_AWAYMODE_REQUIRED) <> 0 then
  try
    // execute your long running task here
  finally
    SetThreadExecutionState(ES_CONTINUOUS);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

或者,也有提供一套新的功能PowerCreateRequest,PowerSetRequest以及PowerClearRequest专为Windows 7,但文档很混乱,我还没有发现在这个时候他们使用的任何例子.

或者您可以通过电源设置子组修改电源设置PowerWriteACValueIndexPowerWriteDCValueIndex使用其功能GUID_DISK_SUBGROUP.


Mar*_*som 5

Windows不允许应用程序禁用电源控制更改,因为错误的应用程序导致电池耗尽.见http://blogs.msdn.com/b/oldnewthing/archive/2007/04/16/2148139.aspx

系统电源状态即将更改时,您可以收到通知.请参阅WM_POWERBROADCAST消息.