Вопрос или проблема
Мне нужно реализовать функцию, которая будет отслеживать блокировку/разблокировку экрана. Я обратился к следующей статье:
Запустить скрипт при блокировке/разблокировке экрана
Мой код скрипта на Python работает отлично в Ubuntu 12.04, но не работает в Ubuntu 14.04:
#!/usr/bin/env python
import gobject
import dbus
from dbus.mainloop.glib import DBusGMainLoop
def filter_cb(bus, message):
if message.get_member() != "ActiveChanged":
return
args = message.get_args_list()
if args[0] == True:
print("Блокировка экрана")
else:
print("Разблокировка экрана")
DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
bus.add_match_string("type="signal",interface="org.gnome.ScreenSaver"")
bus.add_message_filter(filter_cb)
mainloop = gobject.MainLoop()
mainloop.run()
Я также пробовал команду:
dbus-monitor --session "interface="org.gnome.ScreenSaver""
Она не выводит ничего, когда я вручную блокирую/разблокирую экран.
Как я могу отслеживать блокировку/разблокировку экрана в Ubuntu 14.04?
Вы правы.
Так что, чтобы получить правильный ответ здесь, я изменил ваш код на работающий (по крайней мере, в Ubuntu 15.10, Unify):
#!/usr/bin/env python
import gobject
import dbus
from dbus.mainloop.glib import DBusGMainLoop
def filter_cb(bus, message):
if message.get_member() != "EventEmitted":
return
args = message.get_args_list()
if args[0] == "desktop-lock":
print("Блокировка экрана")
elif args[0] == "desktop-unlock":
print("Разблокировка экрана")
DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
bus.add_match_string("type="signal",interface="com.ubuntu.Upstart0_6"")
bus.add_message_filter(filter_cb)
mainloop = gobject.MainLoop()
mainloop.run()
Я думаю, что нашел ответ:
В Ubuntu 14.04 я должен отслеживать интерфейс “com.ubuntu.Upstart0_6” вместо “org.gnome.ScreenSaver”.
Ответ или решение
Для мониторинга блокировки и разблокировки экрана в Ubuntu 14.04 необходимо внести корректировки в ваш исходный код, поскольку в этой версии операционной системы изменились используемые интерфейсы DBus. В данной статье мы рассмотрим, как правильно организовать этот процесс, опираясь на последние изменения в системе.
Шаг 1: Установка необходимых библиотек
Убедитесь, что на вашей системе установлены необходимые библиотеки для работы с DBus и GObject. Используйте следующие команды для установки:
sudo apt-get update
sudo apt-get install python-dbus python-gobject
Шаг 2: Модифицированный скрипт
Ваш исходный скрипт нуждается в изменениях. Мы заменим интерфейс org.gnome.ScreenSaver
на com.ubuntu.Upstart0_6
, что является корректным подходом для мониторинга событий блокировки и разблокировки экрана в Ubuntu 14.04. Вот исправленный код:
#!/usr/bin/env python
import gobject
import dbus
from dbus.mainloop.glib import DBusGMainLoop
def filter_cb(bus, message):
if message.get_member() != "EventEmitted":
return
args = message.get_args_list()
if args[0] == "desktop-lock":
print("Lock Screen")
elif args[0] == "desktop-unlock":
print("Unlock Screen")
DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
bus.add_match_string("type='signal',interface='com.ubuntu.Upstart0_6'")
bus.add_message_filter(filter_cb)
mainloop = gobject.MainLoop()
mainloop.run()
Шаг 3: Запуск скрипта
Сохраните скрипт в файле с расширением .py
, например screen_monitor.py
, и предоставьте ему права на исполнение:
chmod +x screen_monitor.py
Запустите скрипт в терминале:
./screen_monitor.py
Теперь, когда вы будете блокировать или разблокировать экран, в терминале должно появляться соответствующее сообщение.
Примечания
-
Проверка зависит от настроек системы: Убедитесь, что вы работаете в графическом окружении и DBus правильно настроен на отправку сигналов.
-
Управление сигнальными событиями: Если ваш скрипт не выдает никаких сообщений, возможно, другие процессы блокируют обработку событий. Попробуйте запустить ваш скрипт с правами суперпользователя для диагностики.
-
Обновление системы: Если возможно, рассмотрите обновление до более поздних версий Ubuntu (например, 16.04 и выше), так как там могут использоваться другие интерфейсы для управления событиями блокировки.
Вывод
Используя приведенный скрипт, вы сможете эффективно отслеживать события блокировки и разблокировки экрана на Ubuntu 14.04. Это решение является оптимальным и актуальным на сегодняшний день, что позволит вам организовать мониторинг с использованием Python и DBus.