Насколько я знаю, в панели управления Windows доступны только спящие / спящие режимы и параметры выключения в ответ на закрытие кнопки питания и крышки ноутбука:
Я пишу службу Windows, и мне интересно, могу ли я настроить эти параметры? Прежде всего, я должен быть в состоянии выйти из системы пользователя Windows перед отправкой системы в спящий режим.
ОК, должен ответить на мой собственный вопрос. Вот что я смог узнать:
Легко узнать, какое силовое действие будет выполняться при закрытой крышке. Вот код (он должен быть запущен из процесса пользовательского режима):
void getLidClosedAction()
{
GUID* pGuidActivePwrSchm = NULL;
DWORD dwR = PowerGetActiveScheme(NULL, &pGuidActivePwrSchm);
if(dwR == ERROR_SUCCESS)
{
DWORD val;
val = -1;
dwR = PowerReadACValueIndex(NULL, pGuidActivePwrSchm, &GUID_SYSTEM_BUTTON_SUBGROUP, &GUID_LIDCLOSE_ACTION, &val);
if(dwR == ERROR_SUCCESS)
{
_tprintf(L"Lid closed action: ");
switch(val)
{
case 0:
_tprintf(L"Do nothing\n");
break;
case 1:
_tprintf(L"Sleep\n");
break;
case 2:
_tprintf(L"Hibernate\n");
break;
case 3:
_tprintf(L"Shut-down\n");
break;
default:
_tprintf(L"Unknown value=%d\n", val);
break;
}
}
else
{
_tprintf(L"PowerReadACValueIndex error=%d\n", dwR);
}if(pGuidActivePwrSchm)
{
LocalFree(pGuidActivePwrSchm);
pGuidActivePwrSchm = NULL;
}
}
else
{
_tprintf(L"PowerGetActiveScheme error=%d\n", dwR);
}
}
И также легко установить действие питания, когда крышка закрыта (опять же, код должен выполняться в процессе пользовательского режима — в противном случае вам нужно будет получить GUID схемы питания, используя другие средства, кроме PowerGetActiveScheme
вызов):
BOOL setLidClosedAction(DWORD dwVal)
{
//'dwVal' = can be one of:
// 0 = do nothing
// 1 = sleep
// 2 = hibernate
// 3 = shut-down
BOOL bRes = FALSE;
GUID* pGuidActivePwrSchm = NULL;
DWORD dwR = PowerGetActiveScheme(NULL, &pGuidActivePwrSchm);
if(dwR == ERROR_SUCCESS)
{
dwR = PowerWriteACValueIndex(NULL, pGuidActivePwrSchm, &GUID_SYSTEM_BUTTON_SUBGROUP, &GUID_LIDCLOSE_ACTION, dwVal);
if(dwR == ERROR_SUCCESS)
{
bRes = TRUE;
}
else
{
_tprintf(L"PowerWriteACValueIndex error=%d\n", dwR);
}
if(pGuidActivePwrSchm)
{
LocalFree(pGuidActivePwrSchm);
pGuidActivePwrSchm = NULL;
}
}
else
{
_tprintf(L"PowerGetActiveScheme error=%d\n", dwR);
}
return bRes;
}
Это относится и к действиям кнопки включения / выключения. GUID в GUID_SYSTEM_BUTTON_SUBGROUP
как таковые:
GUID_POWERBUTTON_ACTION = power button
GUID_SLEEPBUTTON_ACTION = sleep button
GUID_USERINTERFACEBUTTON_ACTION = sometimes another OEM sleep button
К сожалению, я не смог увидеть, как настроить настраиваемое действие для этих событий.
Просто я хотел бы дать некоторые подсказки для простой системы а также Выйти.
Вы можете получить простой системы, используя BOOL WINAPI GetLastInputInfo(
_Out_ PLASTINPUTINFO plii
);
Это простой метод для простоя системы.
LASTINPUTINFO input_info;
input_info.cbSize = sizeof(LASTINPUTINFO);
::GetLastInputInfo(&input_info);
//input_info.dwTime` means the value of tick count
//when the last input event was received.
//So, you can get idle time by using below code.
DWORD currentTime = GetTickCount();
DWORD timeElapsed = currentTime - input_info.dwTime;
Далее, насколько я знаю, ExitWindowsEx()
Функция может быть использована для выхода из системы, выключения системы и WM_QUERYENDSESSION
отправляется, когда приложение вызывает одну из функций выключения системы.
Надеюсь, это вам немного поможет.