C++
防止電腦在 C++ 中休眠
我需要一種方法來防止電腦休眠,在執行時打開/關閉它。
我相信SetThreadExecutionState可以為 Windows 做到這一點,現在我正在尋找一種在 Linux 中做到這一點的方法。
有一些 C++ 包裝器:
https://github.com/martinhaefner/simppl
https://github.com/makercrew/dbus-sample
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 簡單且與語言無關)。