2015-03-02 14 views
5

Sto provando a scrivere lo script Python che stampa il titolo della finestra attiva usando python in Mac OS.Come ottenere il titolo della finestra attiva usando Python in Mac?

Ecco il mio codice:

from AppKit import NSWorkspace 
active_app_name = NSWorkspace.sharedWorkspace().frontmostApplication().localizedName() 
print active_app_name 

Questo codice stampa solo il nome della app come Google Chrome o Firefox, ma non il titolo. Come ottenere il titolo della finestra?

+1

Possibile duplicato di [Ricerca della finestra attiva corrente in Mac OS X utilizzando Python] (https://stackoverflow.com/questions/373020/finding-the-current-active-window-in-mac-os-x- using-python) – kenorb

risposta

3

Ecco cosa ho usato per trovare sia il nome dell'applicazione attivo che il titolo della finestra su Mac OS X usando Python usando Quartz API.

Prima di tutto, abbiamo bisogno di aggiungere le importazioni, come richiesto:

if sys.platform == "darwin": 
    import applescript 
    from AppKit import NSWorkspace 
    from Quartz import (
     CGWindowListCopyWindowInfo, 
     kCGWindowListOptionOnScreenOnly, 
     kCGNullWindowID 
    ) 

E allora possiamo ottenere il nome dell'applicazione attiva e il titolo della finestra tramite il codice qui sotto:

def getActiveInfo(event_window_num): 
    try: 
     if sys.platform == "darwin": 
      app = NSWorkspace.sharedWorkspace().frontmostApplication() 
      active_app_name = app.localizedName() 

      options = kCGWindowListOptionOnScreenOnly 
      windowList = CGWindowListCopyWindowInfo(options, kCGNullWindowID) 
      windowTitle = 'Unknown' 
      for window in windowList: 
       windowNumber = window['kCGWindowNumber'] 
       ownerName = window['kCGWindowOwnerName'] 
       # geometry = window['kCGWindowBounds'] 
       windowTitle = window.get('kCGWindowName', u'Unknown') 
       if windowTitle and (
           event_window_num == windowNumber 
         or ownerName == active_app_name 
       ): 
        # log.debug(
        #  'ownerName=%s, windowName=%s, x=%s, y=%s, ' 
        #  'width=%s, height=%s' 
        #  % (window['kCGWindowOwnerName'], 
        #  window.get('kCGWindowName', u'Unknown'), 
        #  geometry['X'], 
        #  geometry['Y'], 
        #  geometry['Width'], 
        #  geometry['Height'])) 
        break 

      return _review_active_info(active_app_name, windowTitle) 
     if sys.platform == "win32": 
      (active_app_name, windowTitle) = _getActiveInfo_Win32() 
      return _review_active_info(active_app_name, windowTitle) 
    except: 
     log.error('Unexpected error: %s' % sys.exc_info()[0]) 
     log.error('error line number: %s' % sys.exc_traceback.tb_lineno) 
    return 'Unknown', 'Unknown' 
+0

Puoi dare un esempio di shell completo? Non capisco cosa sia l'argomento event_window_num. O il _review_active_info(). – Yehosef

+0

@Yehosef l'evento_window_num proviene da un evento del mouse o da un evento della tastiera, penso che si possa ignorare questo parametro in modo sicuro. _review_active_info è anche una funzione personalizzata nella mia app per verificare solo app_name e window_title che otteniamo, puoi anche ignorare questo metodo. La parte principale di ottenere nome_app e nome_attività attivo è mostrata nel codice di esempio. –

1

Non c'è accesso al titolo dell'app da NSWorkspace.sharedWorkspace().activeApplication().

Ma è possibile trovare il titolo della finestra corrente dal suo PID:

Ad esempio:

from AppKit import NSWorkspace 
pid = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationProcessIdentifier'] 

poi trovare la finestra di destra usando sotto il codice (è memorizzato in kCGWindowOwnerPID) come indicato in seguito il codice:

Ecco un esempio shell completo basato su @JakeW's script:

#!/usr/bin/python 
# Prints list of windows in the current workspace. 
import sys 
if sys.platform == "darwin": 
    from AppKit import NSWorkspace 
    from Quartz import (
     CGWindowListCopyWindowInfo, 
     kCGWindowListOptionOnScreenOnly, 
     kCGNullWindowID 
    ) 

if sys.platform == "darwin": 
    curr_app = NSWorkspace.sharedWorkspace().frontmostApplication() 
    curr_pid = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationProcessIdentifier'] 
    curr_app_name = curr_app.localizedName() 
    options = kCGWindowListOptionOnScreenOnly 
    windowList = CGWindowListCopyWindowInfo(options, kCGNullWindowID) 
    for window in windowList: 
     pid = window['kCGWindowOwnerPID'] 
     windowNumber = window['kCGWindowNumber'] 
     ownerName = window['kCGWindowOwnerName'] 
     geometry = window['kCGWindowBounds'] 
     windowTitle = window.get('kCGWindowName', u'Unknown') 
     if curr_pid == pid: 
      print("%s - %s (PID: %d, WID: %d): %s" % (ownerName, windowTitle.encode('ascii','ignore'), pid, windowNumber, geometry)) 
elif sys.platform == "win32": 
    (active_app_name, windowTitle) = _getActiveInfo_Win32() 

Elencherà i dettagli della finestra attiva corrente incluso il titolo.

+0

Elenca tutte le finestre dell'applicazione attiva, non solo la finestra attiva. Per esempio. in chrome apri gli strumenti di sviluppo in una finestra separata, non puoi distinguere quale è attivo. – sivann

+0

È necessario aggiungere un'interruzione dopo curr_pid == pid :, e verificare anche l'esistenza di windowTitle – sivann

Problemi correlati