【发布时间】:2016-05-09 03:19:26
【问题描述】:
从我能找到的所有 API 文档中,似乎正确的做法是检查系统事件或可访问性 API 返回的“最前面”窗口,如下所示(此处为 Python 示例,但这是在 ObjC 或 swift 或 ruby 中相同):
#!/usr/bin/env python
from ScriptingBridge import SBApplication
events = SBApplication.applicationWithBundleIdentifier_(
"com.apple.systemevents")
for proc in events.applicationProcesses():
if proc.frontmost():
print(proc.name())
我从这里得到的值与从NSWorkspace.sharedWorkspace().frontmostApplication() 得到的值相同。它通常是正确的。除非提示对话框,尤其是来自系统的提示对话框,实际上是键盘焦点所在。例如,如果 Messages.app 想要我的 Jabber 帐户的密码,或者我的 iCloud 密码更改;这些对话框似乎来自UserNotificationCenter 进程,它不会以某种方式将自己报告为最前面的应用程序,即使它确实具有键盘焦点。
【问题讨论】:
-
询问用户名和密码的对话窗口属于进程
SecurityAgent -
Winfo.app - 来自irradiatedsoftware.com/labs - 告诉我我正在查看的对话框来自
UserNotificationCenter。
标签: macos applescript focus accessibility appkit