본문 바로가기
C & C++/C & C++

전원관리 정보 얻어오기

by izen8 2012. 8. 13.
반응형

[전원 관리 목록을 가져 오는 부분을 정리한다.]

기본적으로 <PowrProf.h> 필요함으로 include 한다.


아래의 코드는 인터넷 검색을 하여 찾았으며,

정상 동작 하는 것을 확인 하였다.

굳이 함수를 바꾸지 않고 바로 호출하여 사용하여도 가능하다

일단 웹상의 코드를 그대로 첨부한다.

원문 : http://blog.naver.com/my_1028?Redirect=Log&logNo=50002603430

= 코드 =

- 선언부 -
typedef BOOLEAN (__stdcall *MYGetActivePwrScheme)(UINT *);
typedef BOOLEAN (__stdcall *MYGetCurrentPowerPolicies)(PGLOBAL_POWER_POLICY,PPOWER_POLICY);
typedef BOOLEAN (__stdcall *MYSetActivePwrScheme)(UINT, PGLOBAL_POWER_POLICY, PPOWER_POLICY);

#define ERROR_ROUTINE(hInstance){ FreeLibrary(hInstanc);\
hInstance=NULL;\
return;\
}


- 실제 코드 -

{

MYGetActivePwrScheme pFunc1 = NULL;
MYGetCurrentPowerPolicies pFunc2 = NULL;
MYSetActivePwrScheme pFunc3 = NULL;

HINSTANCE hInstance = NULL;

hInstance = LoadLibrary(L"powrprof");

if(hInstance)
{
pFunc1 = (MYGetActivePwrScheme)GetProcAddress(hInstance, "GetActivePwrScheme");

if(pFunc1 ==NULL)
{
TRACE(L"GetActivePwrScheme Fail");
//ERROR_ROUTINE(hInstance);
}

pFunc2 = (MYGetCurrentPowerPolicies)GetProcAddress(hInstance, (LPCSTR)"GetCurrentPowerPolicies");
pFunc3 = (MYSetActivePwrScheme)GetProcAddress(hInstance, "SetActivePwrScheme");


UINT uiActivePwrSchIndex;
GLOBAL_POWER_POLICY stGlobalPwrPly;
POWER_POLICY stPwrPly;

if( ((pFunc1)(&uiActivePwrSchIndex)) == 0)
{
TRACE(L"Call GetActivePwrScheme Error");
}

if( ((pFunc2)(&stGlobalPwrPly, &stPwrPly)) == 0)
{
TRACE(L"Call GetCurrentPowerPolicies Error");
}

stPwrPly.user.IdleTimeOutAC = 0; //시스템 대기모드 해제

...

FreeLibrary(hInstance);
hInstance = NULL;
}

 

 



stPwrPly.user.VideoTimeoutAc //모니터 끄기

stPwrPly.user.SpindownTimeoutAc //하드디스크 끄기

stPwrPly.user.IdleTimeoutAc //시스템 대기 모드

 


 

전원제어 ? 전원관리 ?

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);
}

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

 

Suspend 모드로 전환하는 코드

HANDLE hToken;
if (::OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
TOKEN_PRIVILEGES tkp;
::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
::CloseHandle(hToken);
// suspend mode로 전환하는 api
::SetSystemPowerState(true, false);
}

 

 


 

노트북에서 사용 코드


SYSTEM_BATTERY_STATE sys_bat;

if( 0 == CallNtPowerInformation(SystemBatteryState,NULL,0,&sys_bat,sizeof(sys_bat)) )
{
strText.Format(L"AcOnLine %d ", sys_bat.AcOnLine); // 현재 전원 AC 사용 유무
MessageBox(strText);
strText.Format(L"BatteryPresent %d ", sys_bat.BatteryPresent); // 베터리 사용유무 확인
MessageBox(strText);
strText.Format(L"Charging %d ", sys_bat.Charging); // 현재 충전중인지 확인
MessageBox(strText);
strText.Format(L"Discharging %d ", sys_bat.Discharging); // 현재 사용으로 인한 방전중인지 확인
MessageBox(strText);
strText.Format(L"EstimatedTime %d ", sys_bat.EstimatedTime); //베터리 잔여량을 시간으로 표시 
MessageBox(strText); //시스템에따라 안나올수도있음
strText.Format(L"MaxCapacity %d ", sys_bat.MaxCapacity); //베터리의 총량
MessageBox(strText);
strText.Format(L"RemainingCapacity %d ", sys_bat.RemainingCapacity); // 베터리의 잔여량
MessageBox(strText);
}

 

 

반응형

댓글