如何在Mac中使用Python获取活动窗口标题?

如何在Mac中使用Python获取活动窗口标题?,python,macos,Python,Macos,我正在尝试编写Python脚本,在Mac OS中使用Python打印活动窗口的标题 这是我的密码: from AppKit import NSWorkspace active_app_name = NSWorkspace.sharedWorkspace().frontmostApplication().localizedName() print active_app_name 这段代码只打印应用程序的名称,比如谷歌浏览器或firefox,但不打印标题。如何获取窗口标题?以下是我使用Python

我正在尝试编写Python脚本,在Mac OS中使用Python打印活动窗口的标题

这是我的密码:

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

这段代码只打印应用程序的名称,比如谷歌浏览器或firefox,但不打印标题。如何获取窗口标题?

以下是我使用Python和Quartz API在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'

无法从
NSWorkspace.sharedWorkspace().activeApplication()
访问应用程序标题

但您可以通过其PID找到当前窗口标题:

例如:

from AppKit import NSWorkspace
pid = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationProcessIdentifier']
from AppKit import NSWorkspace
NSWorkspace.sharedWorkspace().runningApplications() // for getting all applications
NSWorkspace.sharedWorkspace().frontmostApplication() // for active window
然后使用下面的代码(它存储在
kCGWindowOwnerPID
)找到正确的窗口,如下面的代码所示:

下面是一个完整的shell示例,基于:


它将列出当前活动窗口的详细信息,包括其标题。

从macOS 10.6及更高版本开始,最好使用:如果您希望列出所有应用程序,可以调用方法

您可以在中查看更多详细信息

例如:

from AppKit import NSWorkspace
pid = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationProcessIdentifier']
from AppKit import NSWorkspace
NSWorkspace.sharedWorkspace().runningApplications() // for getting all applications
NSWorkspace.sharedWorkspace().frontmostApplication() // for active window

你能给出一个完整的shell示例吗?我不明白事件窗口参数是用来做什么的。或者_review_active_info()。@Yehosef事件_window_num来自捕获的鼠标事件或键盘事件,我认为您可以安全地忽略此参数_review_active_info也是我的应用程序中的一个自定义函数,用于验证我们获得的应用程序名称和窗口标题,您也可以忽略此方法。示例代码中显示了获取活动应用程序名称和窗口标题的核心部分。不幸的是,我刚刚在导入applescript时立即出现了一个错误:
ImportError:没有名为applescript的模块。
。例如,在chrome中,在一个单独的窗口上打开开发者工具,你无法区分哪个窗口处于活动状态。你需要在curr_pid==pid:,并检查是否存在窗口标题后添加一个中断符。这起作用了,Jake W的投票率较高的答案不起作用。这个答案写得很好,但没有解决OP关于窗口标题的问题。你能更新你的答案,告诉我如何获得这个标题吗?