VC------Windows关机函数,休眠函数使用大全(适用Windows所有操作平台)

来源:互联网 发布:pdf.js php使用教程 编辑:程序博客网 时间:2024/05/17 18:48
关闭Windows函数ExitWindowsEx(UINT     uFlag,DWORD:dwReserved)说明:

控制WINDOWS的开关:如关闭WINDOWS,重新启动WINDOWS等,     ExitWindowsEx(UINT     uFlags,DWORD     dwReserved);是实现这一功能的API函数。如果Complile时提示EWX_XXXX未定义,那么请手动定义这几个常数,默认情况下是无需 我们手动定义的。
const
      EWX_FORCE=4;     //关闭所有程序并以其他用户身份登录?(!!应为“强制执行否”吧!!)
      EWX_LOGOFF=0;     //重新启动计算机并切换到MS-DOS方式
      EWX_REBOOT=2;     //重新启动计算机
      EWX_SHUTDOWN=1;//关闭计算机
      EWX_POWEROFF=5;//好象是5,记不太清了
      EWX_FORCEIFHUNG=7;//7?不记得了,有谁好心查下MSDN
调用方法:
      ExitWindowsEx(EWX_REBOOT,0);     //重启计算机
      ExitWindowsEx(EWX_FORCE+EWX_SHUTDOWN,0);     //强行关机

      不过博主经常听到有人说这一API只在Windows     95/98/98SE/Me下有效,而在Windows     NT/2000/XP下无效。
      其实这是不正确的,这一API在上述平台下均是有效的,只是我们在Windows     NT/2000/XP平台下执行此函数之前,必须要获取得关机特权罢了,其实就算是Windows     NT/2000/XP系统自身关机也必须要走这一流程的。
      获取关机特权函数如下:
      procedure     Get_Shutdown_Privilege;     //获得用户关机特权,仅对Windows     NT/2000/XP
      var   
          rl:     Cardinal;
          hToken:     Cardinal;
          tkp:     TOKEN_PRIVILEGES;   
      begin   
          OpenProcessToken(GetCurrentProcess,     TOKEN_ADJUST_PRIVILEGES     or     TOKEN_QUERY,     hToken);
          if     LookupPrivilegeValue(nil,     "SeShutdownPrivilege ",     tkp.Privileges[0].Luid)     then
          begin
              tkp.Privileges[0].Attributes     :=     SE_PRIVILEGE_ENABLED;
              tkp.PrivilegeCount     :=     1;
              AdjustTokenPrivileges(hToken,     False,     tkp,     0,     nil,     rl);
          end;
      end;

      另一个关机API,InitiateSystemShutdown(PChar(Computer_Name),PChar(Hint_Msg), Time,Force,Reboot);在Windows     NT/2000/XP平台下还会自动调用系统本身的关机提示窗口。
      InitiateSystemShutdown(PChar(Computer_Name),     PChar(Hint_Msg),Time,Force,Reboot);
                                                //关机计算机名,关机提示信息,停留时长,是否强行关机,是否要重启
      当我们把Computer_Name设为nil时,默认为本机,如     InitiateSystemshutdown(nil,nil,0,True,False);//强行关机

      由于我们需要制作一个通用的关机程序,故要对当前的操作系统进行判断,这个比较简单,函数如下:
      function     GetOperatingSystem:     string;//获取操作系统信息
      var       osVerInfo:     TOSVersionInfo;
      begin
          Result     := " ";
          osVerInfo.dwOSVersionInfoSize     :=     SizeOf(TOSVersionInfo);
          if     GetVersionEx(osVerInfo)     then
              case     osVerInfo.dwPlatformId     of
              VER_PLATFORM_WIN32_NT:
              begin
                  Result     :=     "Windows     NT/2000/XP "
              end;
              VER_PLATFORM_WIN32_WINDOWS:
              begin
                  Result     :=     "Windows     95/98/98SE/Me ";
              end;
          end;
      end;

      执行关机的主函数:
      procedure     ShutDownComputer;
      begin
          if     GetOperatingSystem= "Windows     NT/2000/XP "     then   
          begin   
              Get_Shutdown_Privilege;
              //调用此函数会出现系统关机提示窗口,并允许用户取消关机动作
              //InitiateSystemShutDown(nil, "关机提示:讨厌你所以关了你! ",0,True,False);
              ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG,0);
          end     else
          begin
              ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG,0);
          end;
      end;   
使用:

procedure     TShutDownForm.btn_PowerOffClick(Sender:Object);
begin
      ShutDownComputer;
end;

=========================================================================================================================}
实现系统休眠
HANDLE     hToken;                //     handle     to     process     token   
TOKEN_PRIVILEGES     tkp;      //     pointer     to     token     structure   

BOOL     fResult;                //     system     shutdown     flag   

//     Get     the     current     process     token     handle     so     we     can     get     shutdown   
//     privilege.   

if     (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEG     ES ¦TOKEN_QUERY,     &hToken))   
{   
  ShowMessage("OpenProcessToken     failed.");   
  return;   
}   
//     Get     the     LUID     for     shutdown     privilege.   

LookupPrivilegeValue(NULL,     SE_SHUTDOWN_NAME,   
          &tkp.Privileges[0].Luid);   

tkp.PrivilegeCount     =     1;     //     one     privilege     to     set   
tkp.Privileges[0].Attributes     =     SE_PRIVILEGE_ENABLED;   

//     Get     shutdown     privilege     for     this     process.   

AdjustTokenPrivileges(hToken,     FALSE,     &tkp,     0,   
  (PTOKEN_PRIVILEGES)     NULL,     0);   

//     Cannot     test     the     return     value     of     AdjustTokenPrivileges.   

if     (GetLastError()     !=     ERROR_SUCCESS)   
{   
  ShowMessage("AdjustTokenPrivileges     enable     failed.");   
  return;   
}   
SetSystemPowerState(false,TRUE); 
原创粉丝点击