電腦的自動關機、重啟和待機

來源:互聯網
上載者:User
API函數:ExitWindowsEx(Long uFlags,Long dwReserved );
uFlags : 指定下述一個或多個標誌(用OR運算子合并到一起)
   EWX_FORCE     強迫中止沒有響應的進程
   EWX_LOGOFF    中止進程,然後登出
   EWX_SHUTDOWN  關掉系統電源(如果可能的話,ATX電源就可以)
   EWX_REBOOT    重新引導系統
   EWX_SHUTDOWN  關閉系統
dwReserved : 保留,設為零
註:(1)這個函數調用後會立刻返回,系統關閉過程是在後台進行的。注意先中止自己的應用程式,使關閉過程更顯平順。當然,您的進程必須有足夠的優先權,否則也不能執行這種操作;
(2)2000以上系統要提升許可權,下面是提升許可權的函數
    1)BOOL MySystemShutdown(ff)
      {
        HANDLE hToken;
        TOKEN_PRIVILEGES tkp;
        // Get a token for this process.
        if (!OpenProcessToken(GetCurrentProcess(),
           TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
             return( FALSE );
        // Get the LUID for the 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 the shutdown privilege for this process.  
        AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
        (PTOKEN_PRIVILEGES)NULL, 0);  
        if (GetLastError() != ERROR_SUCCESS)
            return FALSE;  
        // Shut down the system And force all applications to close.  
        if (!ExitWindowsEx(ff, 0))  /* 這裡改 EWX_SHUTDOWN 為EWX_REBOOT */
           return FALSE;
       return TRUE;
    }
   2)bool MyExitWindowsEx(UINT uFlag)
{ OSVERSIONINFO osv;
  osv.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
  GetVersionEx(&osv);
  if(osv.dwPlatformId==VER_PLATFORM_WIN32_NT){
     HANDLE hProcess,hToken;
     TOKEN_PRIVILEGES Privileges;
     LUID luid;
     hProcess=GetCurrentProcess();
     OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken);
     Privileges.PrivilegeCount=1;
     LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
     Privileges.Privileges[0].Luid=luid;
     Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
     AdjustTokenPrivileges(hToken,FALSE,&Privileges,NULL,NULL,NULL);
   }
  ExitWindowsEx(uFlag,0);
}

案例:
void __fastcall TForm1::BnOKClick(TObject *Sender)
{
  OSVERSIONINFO ovi;
  ovi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  if(GetVersionEx(&ovi))
   {
     if(ovi.dwPlatformId == VER_PLATFORM_WIN32_NT)
      {
        HANDLE hToken;
        TOKEN_PRIVILEGES tkp;
        if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken))
         {
           LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
           tkp.PrivilegeCount = 1;
           tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
           AdjustTokenPrivileges(hToken, false, &tkp, 0, NULL, 0);
         }
      }
   }
  unsigned int m = EWX_SHUTDOWN;
  if(RbPowerOff->Checked) //選擇了關機
    m|=EWX_POWEROFF;
  else if(RbReboot->Checked) //選擇了重新啟動
    m|=EWX_REBOOT;
  else if(RbLogoff->Checked) //選擇了登出
    m|=EWX_LOGOFF;
  ExitWindowsEx(m,0); //執行選擇的命令
  Close();

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.