如何用Python在macOS中关闭指定窗口?
macOS通过kCGWindowNumber控制单个窗口的解决方案
你可以通过AppleScript配合Python或者Quartz+AppKit结合的方式实现通过kCGWindowNumber关闭/隐藏指定窗口,以下是具体实现方法:
方法1:AppleScript + Python(推荐,兼容性好)
AppleScript对macOS窗口的精细化控制支持完善,Python可以通过subprocess调用osascript执行脚本,直接通过窗口号定位并操作窗口:
关闭指定窗口号的窗口
import subprocess def close_window_by_id(app_name, window_id): # 构造AppleScript脚本,通过窗口ID关闭目标窗口 script = f''' tell application "{app_name}" close window id {window_id} end tell ''' # 执行脚本 subprocess.run(['osascript', '-e', script], check=True) # 调用示例:关闭窗口号为12345的Chrome窗口 close_window_by_id("Google Chrome", 12345)
隐藏(最小化)指定窗口号的窗口
只需将脚本中的close替换为minimize即可:
import subprocess def minimize_window_by_id(app_name, window_id): script = f''' tell application "{app_name}" minimize window id {window_id} end tell ''' subprocess.run(['osascript', '-e', script], check=True)
方法2:Quartz + AppKit结合(需权限)
先通过Quartz筛选出目标窗口的kCGWindowNumber,再结合AppleScript完成窗口操作,需注意两点:
- 目标应用必须支持AppleScript脚本化(主流应用如Chrome、Safari均支持)
- 需给Python赋予辅助功能权限(路径:系统偏好设置 > 安全性与隐私 > 隐私 > 辅助功能,添加你的Python运行环境)
import Quartz import subprocess def get_target_window_number(app_name, window_title_keyword): # 通过Quartz筛选目标窗口,提取kCGWindowNumber window_list = Quartz.CGWindowListCopyWindowInfo(Quartz.kCGWindowListOptionOnScreenOnly, Quartz.kCGNullWindowID) for window_info in window_list: if (window_info.get('kCGWindowOwnerName') == app_name and window_title_keyword in window_info.get('kCGWindowName', '')): return window_info['kCGWindowNumber'] return None # 示例:找到标题含"Stack Overflow"的Chrome窗口号并关闭 window_num = get_target_window_number("Google Chrome", "Stack Overflow") if window_num: close_window_by_id("Google Chrome", window_num)
注意事项
- 若遇到权限报错,检查系统偏好设置的辅助功能权限是否已添加对应的Python环境(如终端、PyCharm等)
- 小众应用若不支持AppleScript,可尝试模拟键盘快捷键(如
Cmd+W关闭窗口),但稳定性不如AppleScript方案
内容的提问来源于stack exchange,提问作者Gordon Hui
相关产品推荐
相关产品推荐

