用BroadcastSystemMessage向所有的程序发WM_POWERBROADCAST消息即可
(可能需要权限)
eg;
procedure Sleep;
var
  BSMRecipents:Dword;
begin
  BSMRecipents:=BSM_APPLICATIONS;
      BroadcastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,@BSMRecipents,WM_POWERBROADCAST,PBT_APMQUERYSUSPEND,0);
end;
如果在2000下不行,用对应的方法获得权限(这个例子获得关几权限):
var
 VerInfo:TOSVersionInfo;
 hToken:THANDLE;
 tkp:TOKEN_PRIVILEGES;
 Nothing:Cardinal;
begin
VerInfo.dwOSVersionInfoSize:=SizeOf(VerInfo);
GetVersionEx(VerInfo);
if VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then
 Begin
   OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
   LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
   tkp.PrivilegeCount:= 1;
   tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
   AdjustTokenPrivileges(hToken, FALSE, tkp, 0,nil, Nothing);
  End;
//Something u want to do
end;