[전원 관리 목록을 가져 오는 부분을 정리한다.]
기본적으로 <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에서 테스트를 해본 관련 함수들을 정리.
: 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); } |
'C & C++ > C & C++' 카테고리의 다른 글
CString to LPTSTR ( CString 형을 LPTSTR로 변환하기 ) (0) | 2012.08.21 |
---|---|
시작버튼, 시계, 작업표시줄, 작업관리자 숨기기!! (0) | 2012.08.21 |
메모리 관련 정보 얻어오기 (0) | 2012.08.13 |
wchar -> char char -> wchar (0) | 2012.07.31 |
사용자 계정 폴더 가져오기 (0) | 2012.06.20 |
댓글