How To Get Active Window Title Using Python In Mac?
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?"