我正在尝试编写Python脚本,该脚本在Mac OS中使用python打印活动窗口的标题。
这是我的代码:
from AppKit import NSWorkspace
active_app_name = NSWorkspace.sharedWorkspace().frontmostApplication().localizedName()
print active_app_name
此代码只打印应用程序的名称,如Google Chrome或firefox,但不打印标题。如何获得窗口的标题?
答案 0 :(得分:4)
以下是我曾经使用Quartz API在Mac OS X上使用Python查找活动应用程序名称和窗口标题的内容。
首先,我们需要根据需要添加导入:
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'
答案 1 :(得分:1)
NSWorkspace.sharedWorkspace().activeApplication()
无权访问应用标题。
但您可以通过PID找到当前窗口标题:
例如:
from AppKit import NSWorkspace
pid = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationProcessIdentifier']
然后使用下面的代码找到正确的窗口(它存储在kCGWindowOwnerPID
中),如下面的代码所示:
以下是基于@JakeW's script的完整shell示例:
#!/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()
它将列出当前活动窗口的详细信息,包括其标题。
答案 2 :(得分:1)
从 macOS 10.6 及更高版本开始,最好使用:frontmostApplication,如果您想列出所有应用程序,您可以调用 runningApplications 方法。
您可以在https://developer.apple.com/documentation/appkit/nsworkspace#overview
查看更多详情例如:
from AppKit import NSWorkspace
NSWorkspace.sharedWorkspace().runningApplications() // for getting all applications
NSWorkspace.sharedWorkspace().frontmostApplication() // for active window