C++

防止電腦在 C++ 中休眠

  • April 4, 2021

我需要一種方法來防止電腦休眠,在執行時打開/關閉它。

我相信SetThreadExecutionState可以為 Windows 做到這一點,現在我正在尋找一種在 Linux 中做到這一點的方法。

有一些 C++ 包裝器:

https://github.com/martinhaefner/simppl

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

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

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

和 DBusBindings https://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
}

僅適用於 Linux,不幸的是,我不知道這在 Unix 系統上是如何工作的:

您應該為此使用systemd 抑製劑(由 elogind 提供的非 systemd 發行版上也提供了抑製劑鎖)。這些可以使用 DBus API 進行控制,因此如果您使用 Qt,則可以使用 QDBus 模組(也可以使用其他 DBus 庫,我認為沒有用於 C/C++ 的特定庫用於使用 systemd 抑製劑, DBus API 簡單且與語言無關)。

引用自:https://unix.stackexchange.com/questions/642656