SYSTEM_POWER_CAPABILITIES sysPowCab = { 0 };
if (CallNtPowerInformation(SystemPowerCapabilities, NULL, 0, &sysPowCab, sizeof(SYSTEM_POWER_CAPABILITIES)) == 0)
{
HANDLE hToken = 0;
TOKEN_PRIVILEGES tkp = {};
if (OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
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);
//Enable allow wake up timer
GUID* pPwrGUID;
GUID subGUID = GUID_SLEEP_SUBGROUP;
GUID BriGUID = GUID_ALLOW_RTC_WAKE;
DWORD ret = PowerGetActiveScheme(NULL, &pPwrGUID);
if (ret == ERROR_SUCCESS)
{
ret = PowerWriteACValueIndex(NULL, pPwrGUID, &subGUID, &BriGUID, 1);
if (ret == ERROR_SUCCESS)
{
}
}
}
}
Это работает, только если я устанавливаю очень близкое время, например, через 5 минут после сна. В противном случае это не сработает.
В чем может быть проблема? Параметры электропитания -> Таймеры пробуждения = уже включено.
Я пытаюсь перевести компьютер в спящий режим в определенное время (00:05) и проснуться в 07:00. [code] SYSTEMTIME sT; GetLocalTime(&sT); if (sT.wHour == 0) { if (sT.wMinute >= 5) { SYSTEMTIME sT = {}; GetLocalTime(&sT); sT.wHour = 5; // UTC+2 I am sT.wMinute = 0; sT.wSecond = 0; sT.wMilliseconds = 0; LARGE_INTEGER WaitTime = {}; SystemTimeToFileTime(&sT, (LPFILETIME)&WaitTime); HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL); if (hTimer) { if (SetWaitableTimer(hTimer, &WaitTime, 0, NULL, NULL, TRUE)) { if (SetSuspendState(FALSE, FALSE, FALSE)) { } } CloseHandle(hTimer); } } } } [/code] Перед этим я включил токен выключения: [code] SYSTEM_POWER_CAPABILITIES sysPowCab = { 0 }; if (CallNtPowerInformation(SystemPowerCapabilities, NULL, 0, &sysPowCab, sizeof(SYSTEM_POWER_CAPABILITIES)) == 0) { HANDLE hToken = 0; TOKEN_PRIVILEGES tkp = {};
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { 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);
//Enable allow wake up timer GUID* pPwrGUID; GUID subGUID = GUID_SLEEP_SUBGROUP; GUID BriGUID = GUID_ALLOW_RTC_WAKE;
DWORD ret = PowerGetActiveScheme(NULL, &pPwrGUID); if (ret == ERROR_SUCCESS) { ret = PowerWriteACValueIndex(NULL, pPwrGUID, &subGUID, &BriGUID, 1); if (ret == ERROR_SUCCESS) { } } } } [/code] Это работает, только если я устанавливаю очень близкое время, например, через 5 минут после сна. В противном случае это не сработает. В чем может быть проблема? Параметры электропитания -> Таймеры пробуждения = уже включено.