2015-03-02 313 views
5

我正在嘗試編寫在Mac OS中使用python打印活動窗口標題的Python腳本。如何在Mac中使用Python獲取活動窗口標題?

這裏是我的代碼:

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

這段代碼只是打印像谷歌Chrome或Firefox,而不是所有權的應用程序的名稱。如何獲得窗口的標題?

+1

[在Python中使用Mac OS X查找當前活動窗口]可能的副本(https://stackoverflow.com/questions/373020/finding-the-current-active-window-in-mac-os-x- using-python) – kenorb 2017-05-28 13:40:44

回答

3

以下是我使用Quartz API使用Python在Mac OS X上查找活動應用程序名稱和窗口標題的內容。

首先,我們需要增加進口的需要:

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

你可以給一個完整的shell例子嗎?我不明白event_window_num參數的用途。或_review_active_info()。 – Yehosef 2016-05-22 08:36:45

+0

@Yehosef event_window_num來自捕獲的鼠標事件或鍵盤事件,我想你可以安全地忽略這個參數。 _review_active_info在我的應用中也是一個自定義函數,用於驗證我們得到的app_name和window_title,您也可以忽略此方法。獲取活動app_name和window_title的核心部分顯示在示例代碼中。 – 2016-05-22 12:40:56

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 2017-05-31 13:32:46

+0

您需要在curr_pid == pid:之後添加一箇中斷,並檢查是否存在windowTitle – sivann 2017-05-31 13:52:18