2009-06-03 6 views
13

mi piacerebbe ottenere l'elenco delle applicazioni in esecuzione nello stesso ordine in cui appaiono quando si fa ⌘ + ⇥Ottenere l'elenco delle applicazioni in esecuzione in ordine di ultimo utilizzo

Vale a dire se uso TextEdit, quindi Anteprima, quindi iCal, l'ordine è

  1. iCal
  2. Anteprima
  3. TextEdit

Utilizzando [[NSWorkspace sharedWorkspace] launchedApplications] non funziona come le applicazioni sono ordinati per data di lancio/id di processo. Enumerare con GetNextProcess non funziona come è anche ordinato da pid.

La registrazione per le notifiche e il mantenimento di un elenco non è un'opzione, poiché è necessario conoscere l'elenco subito dopo l'avvio dell'applicazione. Bene, il primo elemento della lista sarebbe abbastanza in realtà, ma penso che sia più o meno la stessa domanda.

C'è qualche API disponibile per ottenere queste informazioni?

risposta

18

Forse qualcosa di simile:

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

Ottimo, funziona esattamente come previsto. È un peccato che non venga come un'API LaunchServices documentata – 0xced

+9

Ed ecco come utilizzare _LSCopyApplicationArrayInFrontToBackOrder in modo sicuro: http://gist.github.com/163918 – 0xced

3

È necessario registrarsi per le notifiche quando cambia applicazione attiva, come descritto qui: http://www.unsanity.org/archives/000045.php

Una volta fatto ciò, è facile da mantenere una vasta gamma di applicazioni attive ordinati per l'ultima volta attiva.

+0

Link non disponibile più - sarebbe bello se il codice fosse qui ...: - * ( – jQwierdy

2

È impossibile ottenere l'elenco prima dell'avvio dell'applicazione. Dopo aver avviato l'applicazione, è sufficiente registrarsi per le notifiche e mantenere la propria serie di applicazioni.

L'unica soluzione è avviare un processo in background all'accesso utilizzando launchd che semplicemente ascolta le applicazioni.

1

Prova enumerare l'elenco delle finestre con l'accessibilità o CGWindowList API. Le app non sono Windows su Mac OS X, come sicuramente saprai, ma l'ordine delle applicazioni front-to-back dovrebbe essere determinato dall'ordine fronte-retro delle loro finestre in primo piano.

Ovviamente, è necessario ignorare i processi che sono già stati visualizzati da Windows (vale a dire, considerare solo le finestre in primo piano).

+1

Sfortunatamente, questa soluzione non funzionerà perché, come hai detto, le app non sono finestre e un'app senza finestre non può essere trovata con questo metodo. , l'ordine da fronte a retro può essere corretto se si ha solo uno spazio, ma non funziona con più spazi. – 0xced