實現休眠功能很簡單,只要在任意想要執行的地方執行如下給出的休眠函數SetPower()就行,其實休眠很簡單,只需要API:SetSystemPowerState()就行,就如關機/注銷/重啟一樣,只需要ExitWindowEx(),但這些API可以直接用在98下,卻不能用在2000/XP中,因為這裡牽涉到了用戶權限,沒有權限是不能進行這些操作的,所以,首先要取得權限,下面給出代碼:
#define RTN_ERROR 13
void PERR(LPTSTR szAPI, DWORD dwLastError) //休眠時調用到的一個函數,用來
////記錄休眠中遇到的錯誤
{
LPTSTR MessageBuffer;
DWORD dwBufferLength;
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;
WriteFile(GetStdHandle(STD_ERROR_HANDLE),
MessageBuffer,
dwBufferLength,
&dwBytesWritten,
NULL);
LocalFree(MessageBuffer);
}
}
INT SetPower()有 //主要功能函數
{
TOKEN_PRIVILEGES tp;
HANDLE hToken;
LUID luid;
LPTSTR MachineName=NULL;
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;
}
這樣,在任意需要休眠的時候調用SetPower();即可休眠,但是有一點要注意:必須打開了高級電源管理的休眠支持。