我想检测屏幕保护程序是否处于活动状态。在 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
Run Code Online (Sandbox Code Playgroud)
我可能误解了,dbus-send
因为 d-feet 告诉我该方法GetActive
可用。
如何能我发现屏幕活动,最好在桌面独立的方式?有一个相关的问题,但是没有解决。
您没有误解 dbus-send。
只是Gnome-Shell 在撒谎。这意味着 Gnome-Shell 开发人员实际上按原样采用 KDE API 描述,并且只实现了属于 freedesktop空闲抑制规范一部分的 2 个方法。因此,其他方法会返回未实现的错误:
+ } else if (g_strcmp0 (method_name, "GetActive") == 0) {
+ goto unimplemented;
+ } else ...
Run Code Online (Sandbox Code Playgroud)
认为这种方法令人困惑的评论评论被忽略了。
这仍然是 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
Run Code Online (Sandbox Code Playgroud)
因此,最好的方法是尝试多种方法,直到不再出现NotSupported
错误为止。
例如检查 Gnome-Shell:
$ qdbus org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.GetActive
false
Run Code Online (Sandbox Code Playgroud)