¿Cómo obtener el título de la ventana activa usando Python en Mac?

Estoy intentando escribir el script de Python que imprime el título de la ventana activa usando python en Mac OS.

Aquí está mi código:

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

Este código solo imprime el nombre de la aplicación como Google Chrome o Firefox, pero no el título. ¿Cómo obtener el título de la ventana?

Esto es lo que usé para encontrar tanto el nombre de la aplicación activa como el título de la ventana en Mac OS X usando Python usando la API de Quartz.

En primer lugar, debemos agregar las importaciones según sea necesario:

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

Y luego podemos obtener el nombre de la aplicación activa y el título de la ventana a través del siguiente código:

 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' 

No hay acceso al título de la aplicación desde NSWorkspace.sharedWorkspace().activeApplication() .

Pero puedes encontrar el título de la ventana actual por su PID:

Por ejemplo:

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

Luego encuentre la ventana de la derecha usando el siguiente código (está almacenado en kCGWindowOwnerPID ) como se muestra en el siguiente código:

Aquí hay un ejemplo completo de shell basado en el script de @ JakeW :

 #!/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() 

Enumera los detalles de la ventana activa actual, incluido su título.