2010-11-06 13 views
6

Bir (linux x windows) kullanıcının aktif pencereyi alt sekme ile değiştirdiğinde veya tıkladığında bilmenin bir yolu var mı? Bu olayı dinleyen bir betik yazmak istiyorum (eğer böyle bir olay meydana gelirse, o zaman mevcut aktif pencereyi bulmak için betik devam eder - nasıl çözüleceğini biliyorum). Mevcut etkin pencereyi bulmak için yoklamayı da kullanabilirim ama bunu yazmanın kötü bir yolu. "Anket" yerine "dinleyebilecek" bir çözüm bulmayı umuyorum.Etkin pencerede görüntü yakalama (linux için)

Teşekkürler!

+0

Bir cevap buldunuz mu? –

cevap

1

Perl modülünün X11 :: Tops belgesine ilişkin belgelere bakarak yalnızca bir monitor_property_and_structure_change yöntemi olduğunu belirtir. Dolayısıyla, temel X11 kitaplıklarının aradığınız işlevi sağlayacağını tahmin ediyorum.

0

Her pencerede ne kadar zaman harcadığınızı izleyen KTimeTracker KDE programını biliyorum. Ayrıntıları bilmiyorum - aktif pencereleri değiştirme olaylarını takip edip etmediği veya tüm masaüstü bilgisayarların durumunu düzenli olarak kontrol edip etmediği. Yine de, kaynaklar yararlı olabilir: http://www.kde.org/applications/utilities/ktimetracker/.

0

Bunu yapmak için bir gereksinimim vardı ve çözümüm, değişiklikler için kök penceresindeki özelliğinin (Pencere Yöneticisi tarafından sağlanan) izlenmesiydi.

İşte birisine göstermek için yazdım piton-xlib uygulamasının bir kopyası:

import Xlib 
import Xlib.display 

disp = Xlib.display.Display() 
root = disp.screen().root 

NET_ACTIVE_WINDOW = disp.intern_atom('_NET_ACTIVE_WINDOW') 
NET_WM_NAME = disp.intern_atom('_NET_WM_NAME') 

last_seen = {'xid': None} 
def get_active_window(): 
    window_id = root.get_full_property(NET_ACTIVE_WINDOW, 
             Xlib.X.AnyPropertyType).value[0] 

    focus_changed = (window_id != last_seen['xid']) 
    last_seen['xid'] = window_id 

    return window_id, focus_changed 

def get_window_name(window_id): 
    try: 
     window_obj = disp.create_resource_object('window', window_id) 
     window_name = window_obj.get_full_property(NET_WM_NAME, 0).value 
    except Xlib.error.XError: 
     window_name = None 

    return window_name 


if __name__ == '__main__': 
    root.change_attributes(event_mask=Xlib.X.PropertyChangeMask) 
    while True: 
     win, changed = get_active_window() 
     if changed: 
      print(get_window_name(win)) 

     while True: 
      event = disp.next_event() 
      if (event.type == Xlib.X.PropertyNotify and 
        event.atom == NET_ACTIVE_WINDOW): 
       break 

daha tam yorumladı sürüm this gist içindedir.

İlgili konular