Фильтруйте [NSWorkspace runningApplications], чтобы он содержал только пользовательские приложения (без демонов /UIAgents)
Есть ли способ отфильтровать список приложений, заданных [NSWorkspace runningApplications]
скрыть все демоны и т. д., кроме проверки вручную списков приложений для ключа UIAgent? Если приложение не отображается в доке, меня это не интересует.
1 ответ
ОБНОВЛЕНИЕ: Если вы используете Objective-C, мой оригинальный ответ ниже по-прежнему применяется, но если вы используете Swift, это может быть очень легко выполнено более аккуратно, благодаря Swift filter
функция для типов коллекции.
let workspace = NSWorkspace.sharedWorkspace()
let apps = workspace.runningApplications.filter { (app) -> Bool in
return app.activationPolicy == .Regular
};
В Objective-C нечто подобное можно сделать с помощью различных методов предикатов и перечисления NSArray, но они будут немного более многословны, чем их Swift-аналог.
Я нашел ответ после некоторых поисков, но это может быть не сразу очевидно.
Простой способ захватить только процессы, имеющие значки в Dock, - выполнить простой быстрый цикл перечисления и проверить каждый NSRunningApplication
"s activationPolicy
, вот так:
NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
NSArray *apps = [workspace runningApplications];
for (NSRunningApplication *a in apps) {
if (a.activationPolicy == NSApplicationActivationPolicyRegular) {
// Do stuff here
}
}
Как правило, приложения с обычными окнами и иконки док-станции используют NSApplicationActivationPolicyRegular
, Дополнения меню и приложения типа Альфреда NSApplicationActivationPolicyAccessory
, Демоны и т. Д. Без какой-либо видимости пользователя NSApplicationActivationPolicyProhibited
, Эти константы соответствуют ключам LSUIElement и LSBackgroundOnly в Info.plist каждого приложения.
Этот подход должен отлавливать приложения, которые имеют настройки, позволяющие пользователю переключать присутствие значка док-станции приложения путем установки их activationPolicy
динамически.