Skip to content Skip to sidebar Skip to footer

How To Get Active Window Title Using Python In Mac?

I am trying to write the Python script which prints the title of the active window using python in Mac OS. Here is my code: from AppKit import NSWorkspace active_app_name = NSWorks

Solution 1:

Here is what I used to find both the active application name and window title on Mac OS X using Python by using Quartz API.

First of all, we need to add imports as required:

if sys.platform == "darwin":
    import applescript
    fromAppKitimportNSWorkspacefromQuartzimport (
        CGWindowListCopyWindowInfo,
        kCGWindowListOptionOnScreenOnly,
        kCGNullWindowID
    )

And then we can get the active app name and window title via the code below:

defgetActiveInfo(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']))breakreturn _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'

Solution 2:

There is no access to app title from NSWorkspace.sharedWorkspace().activeApplication().

But you can find the current window title by its PID:

For example:

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

Then find the right window using below code (it's stored in kCGWindowOwnerPID) as shown in below code:

Here is a complete shell example based on @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()

It will list details of the current active window including its title.

Solution 3:

As of macOS 10.6 and later it is better to use: frontmostApplication and if you want to get all of the applications listed you can call runningApplications method.

You can see more details at https://developer.apple.com/documentation/appkit/nsworkspace#overview

For example:

from AppKit import NSWorkspace
NSWorkspace.sharedWorkspace().runningApplications() // for getting all applications
NSWorkspace.sharedWorkspace().frontmostApplication() // for active window

Post a Comment for "How To Get Active Window Title Using Python In Mac?"