zoukankan      html  css  js  c++  java
  • 程序的开机关机重启,开机启动,休眠功能delphi实现(使用AdjustTokenPrivileges提升权限)

     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('SoftwareMicrosoftWindowsCurrentVersionRun',True);
          if bRun then
            Reg.WriteString(‘test’,Application.ExeName)
          else
            Reg.DeleteValue('test');
          Reg.CloseKey;
        finally
          Reg.Free;
        end;
      end;

    http://blog.csdn.net/zang141588761/article/details/51859129

  • 相关阅读:
    Dapper 关于类型转换及返回
    Lombok中关于@Data的使用
    java xml中sql处理大于号与小于号
    sqlserver DATEDIFF查询当天/本周/本月/本季度/本年的数据
    idea EasyCode代码生成器插件使用
    sql server 一对多只取第一条 row_number() over (partition by XX order by YY )
    C# 单元测试案例
    C#.字符串转数组,数组转字符串
    关于c#:使用Clipboard.SetText(string)复制空字符串
    progressBarControl 和 backgroundWorker 同时使用方法
  • 原文地址:https://www.cnblogs.com/findumars/p/6711268.html
Copyright © 2011-2022 走看看