2015-01-15 9 views
5

Sto cercando di ottenere un elenco di tutti i pacchetti di applicazioni in esecuzione. Applicazioni GUI che l'utente ha avviato, come mostra il Dock o Activity Monitor (mostra un'icona accanto a determinati processi). Ho scoperto che potrei usare sysctl() con KERN_PROC_ALL per ottenere un elenco di tutti i processi in esecuzione, ma che non mi diranno da quale pacchetto di applicazioni provengono. Applicazioni come Minecraft si presentano come java e questo non è molto utile.Ottiene a livello di programmazione pacchetti di applicazioni in OS X

Ho trovato che il nome del gruppo processo in Activity Monitor mostra più o meno quello che voglio sapere: Activity Monitor Showing Minecraft Launcher Running http://gdries.nl/activmon.png

lingua L'implementazione non è importante. Attualmente funziona in C e funziona, ma se risulta necessario un altro ambiente non è un problema. Tutto quello che voglio fare è rilevare quali applicazioni l'utente ha in esecuzione in modo da poter registrare l'ora in cui ciascuna è stata utilizzata. (Il Controllo genitori fa qualcosa di simile ma lo registra in file plist che non posso analizzare)

+0

scaricare il codice per l'utilità "ps" e utilizzare ciò di cui si ha bisogno. – user3629249

+0

'ps' conosce solo i processi e non ha idea di quale bundle dell'applicazione provenga o anche che esista un pacchetto di applicazioni. Mi dà le stesse informazioni che posso già ottenere con 'sysctl',' KERN_PROC_ALL' e 'KERN_PROCARGS' (sebbene il formato di ritorno di quest'ultimo sia arcano e non documentato). –

risposta

7

Ho trovato un modo per farlo usando le API Swift e Cocoa. Presumibilmente questo dovrebbe anche essere possibile usando semplicemente c, ma questo è abbastanza buono per la mia applicazione.

import Foundation 
import Appkit 

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

for app in applications { 
    println(app) 
} 

app è un oggetto NSApplication e che ha un identificatore bundle, che è quello che volevo sapere.

+1

In Swift 4 'NSWorkspace.shared' invece di' NSWorkspace.sharedWorkspace() 'ha funzionato per me. – Roman

Problemi correlati