在C++上开发一个小型跨平台游戏时,我遇到了以下问题:当玩家在玩USB游戏时,不碰键盘或鼠标,电脑就会自动睡觉。
在Windows环境下,使用SetThreadExecutionState函数可以很容易地完成任务。在OS中,我认为它可以用UpdateSystemActivity完成,但还没有经过测试。
但问题是,在Linux中,DE之间没有什么比普通API更好的了。我发现在Gnome中,您可以通过使用DBus调用Inhibit()和Uninhibit()来停止自动挂起,但它只适用于Gnome。
那么,是否存在一种编程交叉DE方式(或者非DE方式,例如,如果用户使用的是
dwm或awesome wm之类的东西),以防止Linux系统(使用Xorg,当然也没有根访问)在不改变用户配置文件的情况下睡眠或打开屏幕保护程序?
PS:不要认为太复杂,但不知道有多不幸。
发布于 2019-02-11 11:19:07
我用的是QTDBUS
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"
};
for(int i = 0; i < MAX_SERVICES ; i++)
{
QDBusInterface screenSaverInterface(
services[i], paths[i],services[i], bus, this);
if (!screenSaverInterface.isValid())
continue;
QDBusReply<uint> reply = screenSaverInterface.call(
"Inhibit", "YOUR_APP_NAME", "REASON");
if (reply.isValid())
{
cookieID = reply.value();
qDebug()<<"succesful"
} else {
QDBusError error =reply.error();
qDebug()<<error.message()<<error.name();
}
}
}https://stackoverflow.com/questions/31498114
复制相似问题