Из всей документации API, которую я могу найти, кажется, что правильная вещь - проверить «самое переднее» окно, возвращенное системными событиями или API доступности, например (пример в Python здесь, но это то же самое в ObjC или быстрый или рубин или любой другой):Как определить окно с активной фокусировкой клавиатуры с помощью ScriptingBridge (или AppleScript)?
#!/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()
. И это обычно правильно. За исключением случаев, когда диалоговое окно подсказки, особенно одно из системы, является фактически что имеет фокус клавиатуры. Например, если Message.app хочет пароль для моей учетной записи Jabber или если мой пароль iCloud изменяется; эти диалоги, похоже, поступают из процесса UserNotificationCenter
, который каким-то образом не сообщает себя как самое внешнее приложение, хотя он определенно имеет фокус клавиатуры.
Диалоговые окна просят имя пользователя и пароль относятся к процессу 'SecurityAgent' – vadian
Winfo.app - от http://www.irradiatedsoftware.com/labs/ - говорит мне, что диалог, который я смотрел, был из 'UserNotificationCenter'. – Glyph