이것저것/My_Work

[MFC] - 전원 제어

우담바라 2008. 9. 10. 09:18



전원제어 ?    전원관리 ?

Windows XP에서 테스트를 해본 관련 함수들을 정리.


* 모니터 전원 Off  *
:   PostMessage(WM_SYSCOMMAND, SC_MONITORPOWER, 2  );


* Suspend Mode *
;SetSystemPowerState(true, false);
  // 첫번째 Parameter의 값에 따라 suspend / hibernates 모드 변화, true => suspend, false => hirbernate


* Hibernates Mode *
SetSystemPowerState(false, false);  
// 첫번째 Parameter의 값에 따라 suspend / hibernates 모드 변화, true => suspend, false => hirbernate

* Log Off *
ExitWindowsEx(EWX_LOGOFF|EWX_FORCEIFHUNG, SHTDN_REASON_FLAG_PLANNED);  //LOG_OFF


* Power Off *
ExitWindowsEx ( EWX_SHUTDOWN | EWX_FORCE,  SHTDN_REASON_MAJOR_OPERATINGSYSTEM
                      | SHTDN_REASON_MINOR_UPGRADE | SHTDN_REASON_FLAG_PLANNED);






=> 위와 같이 전원을 제어 하기 위해서는 현재 프로세서의 권한을 받아와야한다.

///////////////////////현재 프로세스 권한을 받아오는 소스///////////////////////////////////////

HANDLE hToken;
 if (::OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
 {
  TOKEN_PRIVILEGES tkp;

  //// 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);
  ::CloseHandle(hToken);
}

////////////////////////////////////////////////////////////////////////////////////////////////////