C ++でコンピュータがスリープモードになるのを防ぐ

C ++でコンピュータがスリープモードになるのを防ぐ

実行中にコンピュータの電源を入れたり切ったりして、コンピュータがスリープ状態にならないようにする方法が必要です。

私は信じるスレッド実行状態の設定Windowsでこれを行いましたが、Linuxで実行できる方法を探しています。

答え1

Linuxでのみ動作します。残念ながら、これがUnixシステムでどのように機能するのかわかりません。

使用する必要があります全身阻害剤この目的のために(非システムディストリビューションでelogindが提供するサプレッサロックを使用することもできます)、これはDBus APIを使用して制御できるため、Qtを使用している場合はQDBusモジュールを使用できます(他のDBusライブラリも使用できます)。 C / C ++にはシステムインヒビターを処理するための特定のライブラリがないようです。

答え2

いくつかのC++ラッパーがあります。

https://github.com/martinhaefner/simpll

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

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

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

とDBusBindinghttps://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
}

関連情報