我有一个在 Ubuntu 14.04 (GNOME) 上运行的跨平台应用程序。我需要确定屏幕保护程序是否处于活动状态以及屏幕是否已锁定。
我发现我可以通过以下方式获取屏幕保护程序信息:gnome-screensaver-command -q
但我似乎无法弄清楚如何检测屏幕锁定。例如,在 Unity 上我可以使用:
gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked
但这是 Unity 特有的项目。那么,关于如何在 Gnome 机器上获取此信息,您有什么想法吗?
答案1
发现 /org/gnome/SessionManager/Presence 包含用户会话的当前状态。
可以这样调用:
gdbus call -e -d org.gnome.SessionManager -o /org/gnome/SessionManager/Presence -m org.freedesktop.DBus.Properties.Get /org/gnome/SessionManager/Presence status
快速 bash 测试:
#!/bin/bash
while true; do
echo "PRESENCE "
gdbus call -e -d org.gnome.SessionManager -o /org/gnome/SessionManager/Presence -m org.freedesktop.DBus.Properties.Get /org/gnome/SessionManager/Presence status
echo -e "\n"
sleep 1
done
例如在 Qt 中:
QProcess process;
process.start("sh", QStringList() << "-c"<< "gdbus call -e -d org.gnome.SessionManager -o /org/gnome/SessionManager/Presence -m org.freedesktop.DBus.Properties.Get /org/gnome/SessionManager/Presence status");
process.waitForFinished();
result = QString::fromLatin1(process.readAllStandardOutput());
int state = result.remove("(<uint32 ").remove(">,)").toInt();
if(state != 0) {
// user not active!
}
答案2
上述答案在 Ubuntu 18.04 上返回错误,因为调用需要点而不是斜线。包括未来搜索的错误输出:
错误调用:
$ gdbus call -e -d org.gnome.SessionManager -o /org/gnome/SessionManager/Presence -m org.freedesktop.DBus.Properties.Get /org/gnome/SessionManager/Presence ss
Error: GDBus.Error:org.freedesktop.DBus.Error.InvalidArgs: No such interface '/org/gnome/SessionManager/Presence'
(According to introspection data, you need to pass 'ss')
工作语法示例:
$ gdbus call -e -d org.gnome.SessionManager -o /org/gnome/SessionManager/Presence -m org.freedesktop.DBus.Properties.Get org.gnome.SessionManager.Presence status
(<uint32 0>,)
锁定时的输出:
$ sleep 10; gdbus call -e -d org.gnome.SessionManager -o /org/gnome/SessionManager/Presence -m org.freedesktop.DBus.Properties.Get org.gnome.SessionManager.Presence status
(<uint32 3>,)