当 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,
        &notifycb,
        &registration
    );
    if (registered != ERROR_SUCCESS)
    {
        const DWORD err = GetLastError();
        LOGI("PowerRegisterSuspendResumeNotification failed with error 0x%lx", err);
    }