2016-05-09 6 views
1

Из всей документации 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, который каким-то образом не сообщает себя как самое внешнее приложение, хотя он определенно имеет фокус клавиатуры.

+0

Диалоговые окна просят имя пользователя и пароль относятся к процессу 'SecurityAgent' – vadian

+0

Winfo.app - от http://www.irradiatedsoftware.com/labs/ - говорит мне, что диалог, который я смотрел, был из 'UserNotificationCenter'. – Glyph

ответ

1

"UserNotificationCenter" и "UserNotificationCenter" фоновые приложения (ключ NSUIElement 1 в info.plist).

proc.frontmost() всегда false процесс, который находится в фоновом режиме (без меню, а не в доке).

И NSWorkspace.sharedWorkspace().frontmostApplication() не работает в фоновом режиме.


Чтобы получить активное приложение, используйте метод activeApplication из NSWorkspace класса

Вот AppleScript:

set pyScript to "from AppKit import NSWorkspace 
activeApp = NSWorkspace.sharedWorkspace().activeApplication() 
print activeApp['NSApplicationName'].encode('utf-8') 
print activeApp['NSApplicationProcessIdentifier']" 

set r to do shell script "/usr/bin/python -c " & quoted form of pyScript 
set {localizedAppName, procID} to paragraphs of r -- procID is the unix id 

Update с не устаревшим методом:

set pyScript to "from AppKit import NSWorkspace 
for app in NSWorkspace.sharedWorkspace().runningApplications(): 
     if app.isActive(): 
       print app.localizedName().encode('utf-8') 
       print app.processIdentifier() 
       break" 

set r to do shell script "/usr/bin/python -c " & quoted form of pyScript 
set {localizedAppName, procID} to paragraphs of r -- procID is the unix id 

Чтобы получить переднее окно с идентификатором процесса, используйте переменную procID, как это:

tell application "System Events" 
    tell (first process whose unix id = procID) 
     log (get properties) -- properties of this process 
     tell window 1 to if exists then log (get properties) -- properties of the front window of this process 
    end tell 
end tell 
+0

'activeApplication', похоже, устарел с 10.7. – Glyph

+0

Нет, 'activeApplication' устарел с ** OS X v10.11 **, но по-прежнему работает в' 10.11.4'. Я добавляю в свой ответ другой метод (не устаревший). – jackjr300

 Смежные вопросы

  • Нет связанных вопросов^_^