程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 系統定時休眠

系統定時休眠

編輯:關於VC++

單位最近加強安全檢查,除了部分服務器,下班不關機器的同事,都被罰了款。為此,我試著下載了幾個自動關機的程序,但是都不好使。都是最後顯示“你可以安全地關閉計算機了!”。到網上問了半天說是高級電源管理設置的問題。我折騰了半天,還是不行,為什麼Windows自己的關機就可以關掉電源,而我們的程序就只能“你可以安全的關閉計算了!”。看來微軟還不知道在哪裡留了一手。

好在還有收獲,最近發現MSDN還有這麼一個函數

BOOL SetSystemPowerState(
 BOOL fSuspend, // system state
 BOOL fForce   // forced suspension option
);

真是好東東,比關機器還好,在任何情況下都可以切斷電源(這正是我想要的),也不會有討厭的提示。

函數很簡單,但直接用不好使,前面得加些羅哩八嗦的東東,所以我就進行了一下封裝。

void PERR(LPTSTR szAPI, DWORD dwLastError);
#define RTN_ERROR 13
INT SetPower()
{
  
  // TODO: Add your control notificationhandler code here
  TOKEN_PRIVILEGES tp;
  HANDLE hToken;
  LUID luid;
  LPTSTR MachineName=NULL; // pointer to machine name
  if(!OpenProcessToken(GetCurrentProcess(),
            TOKEN_ADJUST_PRIVILEGES,
            &hToken ))
  {
    PERR("OpenProcessToken", GetLastError() );
    return RTN_ERROR;
  }
  if(!LookupPrivilegeValue(MachineName, SE_SHUTDOWN_NAME, &luid))
  {
    PERR("LookupPrivilegeValue", GetLastError() );
    return RTN_ERROR;
  }
  tp.PrivilegeCount      = 1;
  tp.Privileges[0].Luid    = luid;
  tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),
                NULL, NULL );
    SetSystemPowerState(FALSE,TRUE);
    return 0;
}
void PERR(
  LPTSTR szAPI,    // pointer to failed API name
  DWORD dwLastError  // last error value associated with API
  )
{
  LPTSTR MessageBuffer;
  DWORD dwBufferLength;
  //
  // TODO get this fprintf out of here!
  //
  fprintf(stderr,"%s error! (rc=%lu)\n", szAPI, dwLastError);
  if(dwBufferLength=FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                  FORMAT_MESSAGE_FROM_SYSTEM,
                  NULL,
                  dwLastError,
                  LANG_NEUTRAL,
                  (LPTSTR) &MessageBuffer,
                  0,
                  NULL))
  {
    DWORD dwBytesWritten;
    //
    // Output message string on stderr
    //
    WriteFile(GetStdHandle(STD_ERROR_HANDLE),
         MessageBuffer,
         dwBufferLength,
         &dwBytesWritten,
         NULL);
    //
    // free the buffer allocated by the system
    //
    LocalFree(MessageBuffer);
  }
}

注意:此函數只運行於Windows 2000/XP,並且打開了高級電源管理的休眠支持。

根據這個函數,寫了個小東東,我不想讓他一直運行占我的資源。於是就在計劃任務裡建了一個任務,只要在檢查之前執行就行。呵呵!

總之沒什麼高深的,我也是菜鳥,如果你知道了就不要看了,希望那些愛罵人“高手”不要罵我:-)

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved