C++中防止计算机休眠

C++中防止计算机休眠

我需要一种方法来防止计算机休眠,在运行时打开/关闭它。

我相信设置线程执行状态在 Windows 上做到了这一点,现在我正在寻找一种在 Linux 上做到这一点的方法。

答案1

仅适用于 Linux,不幸的是我不知道这在 Unix 系统上如何工作:

你应该使用系统抑制剂为此(在非 systemd 发行版上也可以使用由 elogind 提供的抑制器锁)。这些可以使用 DBus API 进行控制,因此如果您使用 Qt,您可以使用 QDBus 模块(其他 DBus 库也可用,我不认为 C/C++ 有一个特定的库用于处理 systemd 抑制剂, DBus API 很简单并且与语言无关)。

答案2

有一些 C++ 包装器:

https://github.com/martinhaefner/simpll

https://github.com/makercrew/dbus-sample

https://dbus-cxx.github.io/

http://dbus-cplusplus.sourceforge.net/

和 DBusBindingshttps://www.freedesktop.org/wiki/Software/DBusBindings/

我在 Qt 上,下面是我正在使用的代码,它是中代码的修改版本这个答案

void MainWindow::toggleSleepPevention()
{
#ifdef Q_OS_LINUX
    const int MAX_SERVICES = 2;

    QDBusConnection bus = QDBusConnection::sessionBus();
    if(bus.isConnected())
    {
        QString services[MAX_SERVICES] =
        {
            "org.freedesktop.ScreenSaver",
            "org.gnome.SessionManager"
        };
        QString paths[MAX_SERVICES] =
        {
            "/org/freedesktop/ScreenSaver",
            "/org/gnome/SessionManager"
        };


        static uint cookies[2];

        for(int i = 0; i < MAX_SERVICES ; i++)
        {
            QDBusInterface screenSaverInterface( services[i], paths[i],services[i], bus);

            if (!screenSaverInterface.isValid())
                continue;

            QDBusReply<uint> reply;

            if(preferences.preventSleep == true)
            {
                reply = screenSaverInterface.call("Inhibit", "nzuri-video Downloader", "REASON");
            }
            else
            {
                reply  = screenSaverInterface.call("UnInhibit", cookies[i]);
            }

            if (reply.isValid())
            {
                cookies[i] = reply.value();

                // qDebug()<<"succesful: " << reply;
            }
            else
            {
                // QDBusError error =reply.error();
                // qDebug()<<error.message()<<error.name();
            }
        }
    }

#elif defined  Q_OS_WIN

    EXECUTION_STATE result;

    if(preferences.preventSleep == true)
        result = SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED);
    else
        result = SetThreadExecutionState(ES_CONTINUOUS);

    if(result == NULL)
        qDebug() << "EXECUTION_STATE failed";

#endif
}

相关内容