Puncte:2

Cum să monitorizezi evenimentele aplicației, cum ar fi deschiderea, închiderea, minimizarea în Ubuntu?

drapel cc

Aș dori să știu dacă este posibil să monitorizăm aplicațiile de deschidere/închidere/minimizare evenimente în Ubuntu. Scopul meu inițial este să monitorizez de câte ori deschid telegramă pentru a verifica mesajele.

PS: Folosesc Ubuntu 20.04LTS (X11).

Jacob Vlijm avatar
drapel by
Depinde, ești pe X (Nu wayland)?
Sasha R Adler avatar
drapel cc
@JacobVlijm Da, X11, nu wayland.
Jacob Vlijm avatar
drapel by
Foarte bine posibil. Are nevoie de un scenariu și de câteva explicații. Voi scrie un mic exemplu dacă nimeni nu este mai rapid decât mine :), dar nu sunt sigur dacă este astăzi.
Puncte:3
drapel by

Doar pentru distracție, din moment ce ești pe X

Folosind python (sau o grămadă de alte limbi) Putem folosi semnale de la Wnck.Ecran și Wnck.Fereastră pentru a fi cu ochii pe crearea și/sau schimbarea stării ferestrelor. Aceasta include maximizarea și minimizarea ferestrelor.

Exact asta face scenariul de mai jos. Ulterior, menține un fișier jurnal, care va fi actualizat dacă creați, minimizați sau deminimizați o fereastră a unei anumite WM_CLASS (și așadar aplicație). Puteți găsi WMCLASS al aplicației vizate prin deschiderea unui terminal, tastați xprop WM_CLASS + Întoarcere, apoi faceți clic pe subiectul ferestrei ("telegramdesktop" pentru telegramă sau ceva de genul acesta).

Rețineți că am făcut ca scriptul să resetați fișierul jurnal după fiecare sesiune (de înregistrare), altfel fișierul jurnal ar deveni uriaș în timp.

Ce este în fișierul jurnal?

Fișierul jurnal (~/.windowlog.txt) va ține evidența creării, închiderii și schimbării stării ferestrelor/ferestrelor WM_Class date. De fiecare dată când fereastra este neminimizată, contorul adaugă una, astfel încât la sfârșitul zilei, puteți vedea activitatea:

fereastra găsită: Telegramă
starea schimbată: vizuală(1)
stare schimbată: minimizat
starea schimbată: vizuală(2)
stare schimbată: minimizat
starea schimbată: vizual (3)
fereastra închisă: Telegramă
fereastră nouă: Telegram
starea schimbată: vizuală(4)
stare schimbată: minimizat
starea schimbată: vizual (5)

Notă că scriptul este scris cu o singură fereastră pentru aplicație, ca cea din întrebarea dvs. Pentru a păstra o evidență mai detaliată pe fereastră, prelucrarea datelor ar necesita o codificare mai sofisticată.

Scenariul

#!/usr/bin/env python3
import gi
gi.require_version(„Gtk”, „3.0”)
gi.require_version ("Wnck", "3.0")
din gi.repository import Gtk, Wnck
import os
import sys


clasa WatchWindow:

    def __init__(self, wmclass):
        self.visual = Nici unul
        self.count_visual = 0
        self.wnck_scr = Wnck.Screen.get_default()
        self.wmclass = wmclass
        self.logpath = os.environ["HOME"] + "/.windowlog.txt"
        self.run_watching()
        Gtk.main()

    def write_to_log(self, newline):
        cu open(self.logpath, "a+") ca fișier jurnal:
            logfile.write(linie nouă + „\n”)

    def readable_state(self, minimized):
        n = ""
        dacă nu este minimizat:
            self.count_visual = self.count_visual + 1
            n = "(" + str(self.count_visual) + ")"
        return [„minimizat”, „vizual”][[Adevărat, Fals].index(minimizat)] + n
    
    def logstate(self, window, *args):
        vechi_state = self.visual
        stare_nouă = window.is_minimized()
        # înregistrează-te numai dacă starea minimizată s-a schimbat cu adevărat
        if old_state != new_state:
            self.visual = new_state
            mesaj = "starea schimbată: " + self.readable_state(self.visual) # log
            imprimare (mesaj)
            self.write_to_log(mesaj)

    def log_new(self, screen, window):
        dacă window.get_class_group_name().lower() == self.wmclass:
            mesaj = "fereastră nouă:" + window.get_name() # log new
            imprimare (mesaj)
            self.write_to_log(mesaj)
            self.watch_window(fereastra)
            self.logstate(fereastră)

    def log_closed(self, screen, window):
        dacă window.get_class_group_name().lower() == self.wmclass:
            nume = window.get_name()
            self.visual = Nici unul
            print("fereastra închisă:", nume) # jurnal închis
    
    def watch_window(self, window, firstcall=False):
        dacă window.get_class_group_name().lower() == self.wmclass:
            dacă primul apel:
                mesaj = „fereastra găsită:” + window.get_name()
                print(mesaj) # log vă rog
                self.write_to_log("fereastra găsită: " + window.get_name())
                self.logstate(fereastră)
            window.connect("state_changed", self.logstate)

    def run_watching(self):
        încerca:
            os.remove(self.logpath)
        cu excepția FileNotFoundError:
            trece
        self.wnck_scr.force_update()
        pentru w în self.wnck_scr.get_windows():
            self.watch_window(w, True)
        self.wnck_scr.connect(„fereastra deschisă”, self.log_new)
        self.wnck_scr.connect(„fereastra închisă”, self.log_closed)

args = sys.argv[1:]
daca nu args:
    print("Argumente insuficiente! Avem nevoie de un wm_class pentru a urmări...")
altceva:
    WatchWindow(args[0])

Înființat

  1. Copiați scriptul într-un fișier gol, salvați-l ca windowlogger.py și face-l executabil

  2. Testați-l rulați într-o fereastră de terminal, rulați-l cu WM_CLASS ca argument (presupun telegramdesktop), asa de:

    /cale/la/windowlogger telegramdesktop
    
  3. Vedeți dacă rezultatul din terminal este în regulă, vedeți în interiorul fișierului jurnal ~/.windowlog.txt dacă totul funcționează așa cum ar trebui.

  4. Adăugați-l la aplicațiile dvs. de pornire, dacă doriți.

N.B

Posibil, trebuie să adăugați una sau mai multe biblioteci, verificați ieșirea terminalului.

Fereastra de înregistrare este activă?

Dintr-un comentariu, înțeleg că considerați fereastra ca „folosită” (doar) dacă este fereastra activă.
În acest caz, putem face scriptul substanțial mai simplu, deoarece noi numai trebuie să te uiți la fereastră_activă_schimbată semnal. Dacă înregistrăm și utilizarea timpului (pe utilizare / timpul total de utilizare), puteți obține o perspectivă clară cât timp ați petrecut, uitându-vă la (orice) fereastră de telegramă. Fișierul jurnal arată astfel:

start_time: woensdag, 06 octombrie 2021, 11:32:53
fereastra activata (1)
fereastra ascunsă sau închisă, a fost activă: 0:00:04 total: 0:00:04
fereastra activata (2)
fereastra ascunsă sau închisă, a fost activă: 0:00:06 total: 0:00:10
fereastra activata (3)
fereastra ascunsă sau închisă, a fost activă: 0:00:12 total: 0:00:22
fereastra activata (4)
fereastra ascunsă sau închisă, a fost activă: 0:00:07 total: 0:00:29

Scriptul în acest caz:

#!/usr/bin/env python3
import gi
gi.require_version(„Gtk”, „3.0”)
gi.require_version ("Wnck", "3.0")
din gi.repository import Gtk, Wnck
import os
import sys
timpul de import
import datetime

clasa WatchWindow:

    def __init__(self, wmclass):
        self.visual = Fals
        self.count_visual = 1
        self.wnck_scr = Wnck.Screen.get_default()
        self.wmclass = wmclass
        self.logpath = os.environ["HOME"] + "/.windowlog.txt"
        self.total_time = 0
        self.last_time = time.time()
        self.run_watching()
        Gtk.main()

    def write_to_log(self, newline):
        cu open(self.logpath, "a+") ca fișier jurnal:
            logfile.write(linie nouă + „\n”)

    def get_readable_time(self, elapsed):
        returnează str(datetime.timedelta(secunde=elapsed))

    def log_active(self, *args):
        încerca:
            # active_class poate fi None, de ex. la inceput
            active_class = self.wnck_scr.get_active_window().get_class_group_name()
        cu excepția AttributeError:
            active_class = ""
        newvisual = active_class.lower() == self.wmclass.lower()
        oldvisual = self.visual
        currtime = timp.timp()
        if newvisual != oldvisual:
            dacă newvisual:
                self.last_time = currtime
                mesaj = "fereastra activată (" + str(self.count_visual) + ")"
                self.count_visual = self.count_visual + 1
            altceva:
                winactive_time = currtime - self.last_time
                self.last_time = currtime
                self.total_time = self.total_time + winactive_time
                mesaj = „fereastra ascunsă sau închisă, a fost activă: „ + \
                          self.get_readable_time(round(winactive_time)) +\
                          "\t" + "total: " +\
                          self.get_readable_time(round(self.total_time))
            self.write_to_log(mesaj)
        self.visual = newvisual

    def run_watching(self):
        încerca:
            os.remove(self.logpath)
        cu excepția FileNotFoundError:
            trece
        time_stamp_message = "start_time: " + time.strftime ("%A, %B %d %Y, %H:%M:%S")
        self.write_to_log(time_stamp_message)
        self.wnck_scr.force_update()
        self.wnck_scr.connect ("activ-window-schimbat", self.log_active)
        self.log_active()

args = sys.argv[1:]
daca nu args:
    print("Argumente insuficiente! Avem nevoie de un wm_class pentru a urmări...")
altceva:
    WatchWindow(args[0])

Configurarea este aceeași.

vanadium avatar
drapel cn
Acum avem nevoie și de asta pe Wayland, așa că putem comuta ;)
Jacob Vlijm avatar
drapel by
@vanadium Hehe, corect.
Sasha R Adler avatar
drapel cc
Multumesc, asta vreau. În plus, am adăugat un semnal „active-window-changed” pentru a monitoriza dacă fereastra activă revine la telegramă.
Sasha R Adler avatar
drapel cc
@JacobVlijm Sigur, asta va fi grozav.
Jacob Vlijm avatar
drapel by
@SashaRAdler gata.
Sasha R Adler avatar
drapel cc
@JacobVlijm Cool, mulțumesc.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.