2015-03-02 3 views
5

Я пытаюсь написать скрипт Python, который печатает заголовок активного окна с использованием python в Mac OS.Как получить активное название окна с помощью Python в Mac?

Вот мой код:

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

Этот код просто печатает название приложения, как хром Google или Firefox, но не название. Как получить название окна?

+1

Возможный дубликат [Поиск текущего активного окна в Mac OS X с использованием Python] (https://stackoverflow.com/questions/373020/finding-the-current-active-window-in-mac-os-x- using-python) – kenorb

ответ

3

Вот что я использовал для поиска как активного имени приложения, так и названия окна в Mac OS X с использованием Python с использованием Quartz API.

Прежде всего, нам нужно добавить импорт в соответствии с требованиями:

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

И тогда мы можем получить активное название приложения и заголовок окна с помощью кода ниже:

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

Не могли бы вы дать полный пример оболочки? Я не понимаю, для чего предназначен event_window_num arg. Или _review_active_info(). – Yehosef

+0

@Yehosef event_window_num от события мыши или события клавиатуры, я думаю, вы можете безопасно игнорировать этот параметр. _review_active_info также является настраиваемой функцией в моем приложении, чтобы просто подтвердить имя app_name и window_title, которые мы получаем, вы также можете игнорировать этот метод. Основная часть получения активного имени app_name и window_title показана в примере кода. –

1

Существует нет доступ к названию приложения от NSWorkspace.sharedWorkspace().activeApplication().

Но вы можете найти текущий заголовок окна по его PID:

Например:

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

Затем найти нужное окно, используя ниже код (он хранится в kCGWindowOwnerPID), как показано ниже код:

Вот полный пример оболочки на основе @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() 

Он отобразит информацию о текущем активном окне, включая его заголовок.

+0

В этом списке перечислены все окна активного приложения, а не только активное окно. Например. в chrome открыть инструменты разработчика в отдельном окне, вы не можете отличить, что является активным. – sivann

+0

Вам нужно добавить перерыв после curr_pid == pid :, а также проверить наличие windowTitle – sivann