我想检测屏幕保护程序是否处于活动状态。在 Ubuntu 14.04 和 Fedora 21 上,我尝试了以下命令:
$ dbus-send --print-reply=literal --dest=org.freedesktop.ScreenSaver /org/freedesktop/ScreenSaver org.freedesktop.ScreenSaver.Lock
Error org.freedesktop.DBus.Error.NotSupported: This method is not implemented
我可能误解了,dbus-send
因为 d-feet 告诉我该方法GetActive
是可用的。
如何能我检测屏幕保护程序活动,最好以独立于桌面的方式?有一个相关问题,然而这并没有解决。
答案1
根据您的环境:
$ qdbus org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.GetActive
$ qdbus org.kde.screensaver /ScreenSaver org.freedesktop.ScreenSaver.GetActive
$ qdbus org.gnome.ScreenSaver /ScreenSaver org.gnome.ScreenSaver.GetActive
正确的人应该给出正确或错误的陈述。不正确的就会报错。
$ qdbus org.gnome.ScreenSaver /ScreenSaver org.gnome.ScreenSaver.GetActive
false
$ qdbus org.kde.screensaver /ScreenSaver org.freedesktop.ScreenSaver.GetActive
Service 'org.kde.screensaver' does not exist.
(我正在运行 Gnome)
答案2
您没有误解 dbus-send。
只是这样Gnome-Shell 在撒谎。这意味着 Gnome-Shell 开发人员实际上按原样采用 KDE API 描述,并且只实现了属于 freedesktop 一部分的 2 个方法怠速抑制规范。因此,其他方法会返回未实现的错误:
+ } else if (g_strcmp0 (method_name, "GetActive") == 0) {
+ goto unimplemented;
+ } else ...
认为这种方法令人困惑的评论评论被忽略了。
这仍然是 Gnome-Shell 3.38.1 的现状(例如在 Fedora 33 上):
$ qdbus org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.GetActive
Error: org.freedesktop.DBus.Error.NotSupported
This method is not implemented
$ qdbus org.freedesktop.ScreenSaver /org/freedesktop/ScreenSaver org.freedesktop.ScreenSaver.GetActive
Error: org.freedesktop.DBus.Error.NotSupported
This method is not implemented
因此,最好的方法是尝试多种方法,直到不再出现错误NotSupported
为止。
例如检查 Gnome-Shell:
$ qdbus org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.GetActive
false