Захватывает событие закрытия крышки ноутбука в Windows? - PullRequest
5 голосов
/ 20 декабря 2010

Я ищу способ перехватить событие закрытия крышки ноутбука. В windows 7 управление питанием позволяет мне выбрать желаемое поведение при закрытой крышке. Таким образом, должен быть способ, которым окна знают, когда крышка закрыта.

Я провел свое исследование, но нашел только предложения по мониторингу события сна. Я хотел бы быть более конкретным, чтобы реагировать только на закрытие крышки.

У кого-нибудь есть предложения?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 12 мая 2016

Вопрос относится к GUID_LIDSWITCH_STATE_CHANGE, а не к GUID_LIDCLOSE_ACTION.

GUID_LIDCLOSE_ACTION контролирует, изменяет ли пользователь режим питания при закрытии крышки (Панель управления -> Настройки питания -> Выберите, что делает закрывающая крышка)

Если вы хотите отслеживать событиекрышка закрыта / открыта, вам нужно зарегистрироваться на GUID_LIDSWITCH_STATE_CHANGE.Я использовал службу Windows:

int ServiceMain(int argc, char** argv)
{
    serviceStatusHandle = RegisterServiceCtrlHandlerExA(serviceName, (LPHANDLER_FUNCTION_EX) ServiceControlHandler, 0);
    ...
    lidcloseRegHandle = RegisterPowerSettingNotification(serviceStatusHandle, &GUID_LIDSWITCH_STATE_CHANGE, DEVICE_NOTIFY_SERVICE_HANDLE);
    ...
}

А в обработчике управления службами:

/**
* Event handler for windows service.
*/
void WINAPI ServiceControlHandler(DWORD controlCode, DWORD evtype, PVOID evdata, PVOID Context)
{
    switch (controlCode)
    {...
         case SERVICE_CONTROL_POWEREVENT:
         WriteToLog("Service Control: SERVICE_CONTROL_POWEREVENT builds and fwd the msg");
         msg.control = SERVICE_CONTROL_POWEREVENT;
         msg.event_type = (int) evtype;
         msg.event_data = evdata;
     ...
    }
}

evtype - это PBT_POWERSETTINGCHANGE, а в evdata вы регистрируете событие: 0 для закрытого и 1 для открытого.

Подробнее здесь: https://msdn.microsoft.com/en-us/library/aa372723.aspx https://msdn.microsoft.com/en-us/library/hh769082(v=vs.85).aspx

4 голосов
/ 20 декабря 2010

Вы можете зарегистрироваться для уведомления, когда крышка закрыта с помощью RegisterPowerSettingNotification.

AnswerLid Закрыть Уведомление об изменении действия

http://social.msdn.microsoft.com/Forums/en-US/tabletandtouch/thread/0bbf90be-9322-47fb-bfa4-016b57211b3a

В Vista вы можете зарегистрироваться для обратного вызова при изменении действия закрытия крышки.Это делается путем вызова RegisterPowerSettingNotification (подробности см. http://msdn2.microsoft.com/en-us/library/aa373196.aspx).GUID для этого параметра мощности, который вас интересует, - GUID_LIDCLOSE_ACTION.Это определено в wdm.h в SDK платформы.

После регистрации WM_POWERBROADCAST будет отправлено вашему приложению с wParam, установленным в PBT_POWERSETTINGCHANGE.Это событие отправляется каждый раз, когда изменяется значение для действия закрытия крышки.LParam содержит указатель на структуру POWERBROADCAST_SETTING (см. http://msdn2.microsoft.com/en-us/library/aa372723.aspx), содержащую информацию об изменении настройки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...