Получение списка запущенных приложений, заказанных при последнем использовании

Я хотел бы получить список запущенных приложений в том же порядке, что и при выполнении ⌘ + ⇥

т.е. если я использую TextEdit, затем Предварительный просмотр, затем iCal, порядок

  • ческих
  • Предварительный просмотр
  • TextEdit

Использование [[NSWorkspace sharedWorkspace] launchedApplications] не работает, поскольку приложения сортируются по дате запуска/идентификатору процесса. Перечисление с помощью GetNextProcess не работает, так как оно также упорядочивается с помощью pid.

Регистрация для уведомлений и сохранение списка сами по себе не является вариантом, так как я должен знать список сразу после запуска приложения. Ну, первого элемента списка было бы достаточно на самом деле, но я думаю, что это почти такой же вопрос.

Есть ли какой-нибудь API для получения этой информации?

Ответы

Ответ 1

Возможно, что-то вроде этого:

cd /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework
nm LaunchServices | grep __LSCopyApplicationArrayInFrontToBackOrder

Ответ 2

Вам необходимо зарегистрироваться для уведомлений при изменении активного приложения, как описано здесь: http://www.unsanity.org/archives/000045.php

Как только это будет сделано, легко поддерживать массив активных приложений, отсортированных по последнему активному времени.

Ответ 3

Невозможно получить список до запуска приложения. После запуска приложения вы можете просто зарегистрироваться для уведомлений и поддерживать свой собственный массив приложений.

Единственное решение - запустить фоновый процесс при входе в систему с помощью запуска, который просто прослушивает приложения.

Ответ 4

Попробуйте перечислить список окон с API-интерфейсом Accessibility или CGWindowList. Приложения не являются окнами в Mac OS X, так как я уверен, что вы знаете, но порядок приложений сверху до конца должен определяться положением "спереди-назад" их передних окон.

Вам, конечно, нужно будет игнорировать процессы, которые вы уже видели в Windows (т.е. рассматривайте только их передние окна).