当 OS 挂起时自动 pausing/continuing 一个服务
Automatically pausing/continuing a service when OS suspends
我做了一个Windows服务流程可以started/stopped/paused/continued.
服务是用 CreateService()
创建的,服务用 RegisterServiceCtrlHandlerExA()
启动服务控制器。
尽管该服务可以使用 RegisterPowerSettingNotification()
订阅电源设置通知,但我发现这些仅代表笔记本电脑的 battery/mains 等事件。不适用于 OS 的 suspend/sleep。
如何让 SCM 在 OS suspends/sleeps 之前自动暂停我的服务?在它再次醒来后继续我的服务?
这需要调用 PowerRegisterSuspendResumeNotification()
function。
为此,您需要 #include <powrprof.h>
和 link 对抗 powrprof.lib
。
回调本身如下所示:
static ULONG DeviceNotifyCallbackRoutine
(
PVOID Context,
ULONG Type, // PBT_APMSUSPEND, PBT_APMRESUMESUSPEND, or PBT_APMRESUMEAUTOMATIC
PVOID Setting // Unused
)
{
LOGI("DeviceNotifyCallbackRoutine");
if (Type == PBT_APMSUSPEND)
{
turboledz_pause_all_devices();
LOGI("Devices paused.");
}
if (Type == PBT_APMRESUMEAUTOMATIC)
{
turboledz_paused = 0;
LOGI("Device unpaused.");
}
return 0;
}
static DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS notifycb =
{
DeviceNotifyCallbackRoutine,
NULL,
};
然后注册:
HPOWERNOTIFY registration;
const DWORD registered = PowerRegisterSuspendResumeNotification
(
DEVICE_NOTIFY_CALLBACK,
¬ifycb,
®istration
);
if (registered != ERROR_SUCCESS)
{
const DWORD err = GetLastError();
LOGI("PowerRegisterSuspendResumeNotification failed with error 0x%lx", err);
}
我做了一个Windows服务流程可以started/stopped/paused/continued.
服务是用 CreateService()
创建的,服务用 RegisterServiceCtrlHandlerExA()
启动服务控制器。
尽管该服务可以使用 RegisterPowerSettingNotification()
订阅电源设置通知,但我发现这些仅代表笔记本电脑的 battery/mains 等事件。不适用于 OS 的 suspend/sleep。
如何让 SCM 在 OS suspends/sleeps 之前自动暂停我的服务?在它再次醒来后继续我的服务?
这需要调用 PowerRegisterSuspendResumeNotification()
function。
为此,您需要 #include <powrprof.h>
和 link 对抗 powrprof.lib
。
回调本身如下所示:
static ULONG DeviceNotifyCallbackRoutine
(
PVOID Context,
ULONG Type, // PBT_APMSUSPEND, PBT_APMRESUMESUSPEND, or PBT_APMRESUMEAUTOMATIC
PVOID Setting // Unused
)
{
LOGI("DeviceNotifyCallbackRoutine");
if (Type == PBT_APMSUSPEND)
{
turboledz_pause_all_devices();
LOGI("Devices paused.");
}
if (Type == PBT_APMRESUMEAUTOMATIC)
{
turboledz_paused = 0;
LOGI("Device unpaused.");
}
return 0;
}
static DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS notifycb =
{
DeviceNotifyCallbackRoutine,
NULL,
};
然后注册:
HPOWERNOTIFY registration;
const DWORD registered = PowerRegisterSuspendResumeNotification
(
DEVICE_NOTIFY_CALLBACK,
¬ifycb,
®istration
);
if (registered != ERROR_SUCCESS)
{
const DWORD err = GetLastError();
LOGI("PowerRegisterSuspendResumeNotification failed with error 0x%lx", err);
}