Настройка кнопки питания и крышки

Насколько я знаю, в панели управления Windows доступны только спящие / спящие режимы и параметры выключения в ответ на закрытие кнопки питания и крышки ноутбука:

введите описание изображения здесь

Я пишу службу Windows, и мне интересно, могу ли я настроить эти параметры? Прежде всего, я должен быть в состоянии выйти из системы пользователя Windows перед отправкой системы в спящий режим.

0

Решение

ОК, должен ответить на мой собственный вопрос. Вот что я смог узнать:

Легко узнать, какое силовое действие будет выполняться при закрытой крышке. Вот код (он должен быть запущен из процесса пользовательского режима):

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

К сожалению, я не смог увидеть, как настроить настраиваемое действие для этих событий.

1

Другие решения

Просто я хотел бы дать некоторые подсказки для простой системы а также Выйти.

Вы можете получить простой системы, используя 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 отправляется, когда приложение вызывает одну из функций выключения системы.

Функция ExitWindowsEx

Надеюсь, это вам немного поможет.

0

По вопросам рекламы [email protected]