TShutDownStatus = (sdShutDown, sdReboot, sdLogOff, sdPowerOff);

procedure ShutDown(sdStatus: TShutDownStatus);
var
  NewState: TTokenPrivileges;
  lpLuid: Int64;
  ReturnLength: DWord;
  ToKenHandle: Cardinal;
begin
  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES OR
    TOKEN_ALL_ACCESS OR STANDARD_RIGHTS_REQUIRED OR TOKEN_QUERY, ToKenHandle);
  LookupPrivilegeValue(nil, 'SeShutdownPrivilege', lpLuid);
  NewState.PrivilegeCount := 1;
  NewState.Privileges[0].Luid := lpLuid;
  NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
  ReturnLength := 0;
  AdjustTokenPrivileges(ToKenHandle, False, NewState, 0, nil, ReturnLength);
  case sdStatus of
    sdShutDown:
      ExitWindowsEx(EWX_SHUTDOWN OR EWX_POWEROFF or EWX_FORCE, 0);
    sdReboot:
      ExitWindowsEx(EWX_REBOOT OR EWX_POWEROFF or EWX_FORCE, 0);
    sdLogOff:
      ExitWindowsEx(EWX_LOGOFF, 0);
    sdPowerOff:
      SetSystemPowerState(False, True);
  end;

end;

{
  函数功能:实现系统睡眠休眠功能
  bHibernate : True 睡眠  False 休眠
}

procedure TEpComOper.SystemSleep(bHibernate: Boolean);
var
  h_Module: THandle;
  pSetSuspendState: function(Hibernate, ForceCritical, DisableWakeEvent
    : Boolean): Boolean;
begin
  h_Module := LoadLibrary('PowrProf.dll');
  if h_Module <> 0 then
  begin
    pSetSuspendState := GetProcAddress(h_Module, 'SetSuspendState');
    if @pSetSuspendState <> nil then
    begin
      pSetSuspendState(bHibernate, False, False);
    end;
    FreeLibrary(h_Module);
  end;
end;

{ 设置取消程序的开机启动功能 }
procedure TEpComOper.SetAppAutoRun(bRun: Boolean);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
    if bRun then
      Reg.WriteString(‘ test ’, Application.ExeName)
    else
      Reg.DeleteValue('test');
    Reg.CloseKey;
  finally
    Reg.Free;
  end;
end;
posted on 2019-05-24 09:57  万一  阅读(179)  评论(0)    收藏  举报