2015-01-15 9 views
5

Próbuję uzyskać listę wszystkich uruchomionych pakietów aplikacji. Aplikacje GUI, które użytkownik uruchomił, np. Dock, lub Monitor aktywności (pokazuje ikonę obok niektórych procesów). Zauważyłem, że mogę użyć sysctl() z KERN_PROC_ALL, aby uzyskać listę wszystkich uruchomionych procesów, ale to nie powie mi, z którego pakietu aplikacji pochodzą. Aplikacje takie jak Minecraft po prostu pojawiają się jako java i to nie jest zbyt użyteczne.Programowe pobieranie pakietów aplikacji w systemie OS X

znalazłem, że nazwa grupy procesów w monitorze aktywności pokazuje z grubsza to, co chcę wiedzieć: Activity Monitor Showing Minecraft Launcher Running http://gdries.nl/activmon.png

język Realizacja nie jest ważne. Obecnie pracuje w C i idzie, ale jeśli okaże się, że inne środowisko jest wymagane, to nie jest problem. Wszystko, co chcę zrobić, to wykryć aplikacje, które uruchamia użytkownik, aby móc rejestrować czas, w którym każdy z nich był używany. (Kontrola rodzicielska robi coś podobnego, ale loguje je w plikach plist, których nie mogę przetworzyć)

+0

pobierz kod narzędzia "ps" i użyj tego, czego potrzebujesz. – user3629249

+0

"ps" zna tylko procesy i nie ma pojęcia, z jakiego pakietu aplikacji pochodzi dany proces, a nawet, że istnieje coś takiego jak pakiet aplikacji. Daje mi te same informacje, które mogę już uzyskać z 'sysctl',' KERN_PROC_ALL' i 'KERN_PROCARGS' (chociaż jego format powrotu jest tajemny i nieudokumentowany). –

Odpowiedz

7

Znalazłem sposób, aby to zrobić za pomocą interfejsów API Swift i Cocoa. Prawdopodobnie powinno to być również możliwe przy użyciu zwykłego c, ale jest to wystarczająco dobre dla mojego wniosku.

import Foundation 
import Appkit 

// Get all running applications 
var workspace = NSWorkspace.sharedWorkspace() 
var applications = workspace.runningApplications 

for app in applications { 
    println(app) 
} 

app jest obiektem NSApplication i że ma identyfikator pakietu, który jest to, co chciałem wiedzieć.

+1

W Swift 4 'NSWorkspace.shared' zamiast' NSWorkspace.sharedWorkspace() 'działało dla mnie. – Roman

Powiązane problemy