실행 중에 컴퓨터를 켜거나 꺼서 컴퓨터가 잠자기 상태가 되지 않도록 하는 방법이 필요합니다.
나는 믿는다스레드 실행 상태 설정Windows에서 이 작업을 수행했으며 이제 Linux에서 수행할 수 있는 방법을 찾고 있습니다.
답변1
Linux에서만 작동합니다. 불행히도 이것이 Unix 시스템에서 어떻게 작동하는지 모르겠습니다.
당신은 사용해야합니다전신 억제제이러한 목적으로 (비시스템 배포판에서 elogind가 제공하는 억제기 잠금을 사용할 수도 있습니다) 이는 DBus API를 사용하여 제어할 수 있으므로 Qt를 사용하는 경우 QDBus 모듈을 사용할 수 있습니다(다른 DBus 라이브러리도 사용할 수 있습니다. C/C++에는 시스템 억제제를 처리하기 위한 특정 라이브러리가 없는 것 같습니다. DBus API는 간단합니다. 언어 독립적으로 작동합니다).
답변2
몇 가지 C++ 래퍼가 있습니다.
https://github.com/martinhaefner/simpll
https://github.com/makercrew/dbus-sample
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
}