在 shell/c++ 中偵測螢幕鎖定

在 shell/c++ 中偵測螢幕鎖定

我有一個在 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>,)

文件https://people.gnome.org/~mccann/gnome-session/docs/gnome-session.html#org.gnome.SessionManager.Presence

相關內容