19 votes

Comment activer une application Mac OS X avec un identifiant de processus donné ?

Je connais l'identifiant de processus d'une application dans Mac OS X. Comment puis-je passer à cette application (en utilisant applescript, ou python, ou autre) ?

Par "commutation", j'entends la mise au point.

La solution habituelle consiste à utiliser le code applescript tell application "Foo" activate mais ici le nom n'est pas utile car j'ai plusieurs instances de la même application en cours d'exécution. Je suis cependant en mesure d'obtenir l'identifiant du processus de l'application.

Comment puis-je basculer vers cette application de manière programmatique ?

10voto

stib Points 803

Si vous ne voulez pas/ne pouvez pas installer de logiciel supplémentaire, il existe un moyen intégré de rechercher les ID de processus et les applications : ps.

ps est un outil de ligne de commande utile pour obtenir des informations sur les processus en cours. Pour trouver une application particulière à partir du numéro du processus (que j'ai assigné à une variable myProcessId) :

do shell script "ps -p " & myProcessId

ce qui donnera un résultat comme celui-ci

  PID TTY           TIME CMD
66766 ??         9:17.66 /Applications/Firefox.app/Contents/MacOS/firefox-bin -psn_0_3793822

pour restreindre le résultat à la seule ligne concernée, envoyez-le à grep comme suit

do shell script "ps -p " & myProcessId & "|grep " & myProcessId

En analysant la réponse, vous pouvez trouver le nom de l'application. Cela peut être un peu difficile car le résultat montrera la commande utilisée pour l'application, et non le nom de l'application (si vous regardez l'exemple, vous verrez qu'il est possible de le trouver en cherchant something.app dans le résultat).

Edit - désolé, j'ai mal compris la question.

Vous pouvez le faire avec les événements du système (ce qui s'avère de toute façon beaucoup plus facile que de se débrouiller avec le shell) :

tell application "System Events"
    set theprocs to every process whose unix id is myProcessId
    repeat with proc in theprocs
        set the frontmost of proc to true
    end repeat
end tell

8voto

mklement0 Points 12597

Réponse de @stib fonctionne, mais peut être simplifiée :

Étant donné que, par définition, seuls les un processus peut correspondre - les PID (process ID) identifient de manière unique un processus unique - il y a des processus qui peuvent correspondre. pas besoin d'une boucle : il suffit de cibler directement l'élément premier - et par définition seulement - élément de la liste des PIDs renvoyés par le filtre process whose unix id is ... :

# Assumes that variable `myProcessId` contains the PID of interest.
tell application "System Events"
  set frontmost of the first process whose unix id is myProcessId to true
end tell

ehime a apporté la contribution suivante bash de l'enveloppe de la fonction :

# Pass the PID as the 1st (and only) argument.
activateByPid()
{
  osascript -e "
    tell application \"System Events\"
      set frontmost of the first process whose unix id is ${1} to true
    end tell
  "
}

Exemple d'appel (en supposant que activateByPid a été défini ou source dans l'interpréteur de commandes actuel) :

# Activate Safari by its PID.
activateByPid $(pgrep -x 'Safari')

2voto

Olivier Verdier Points 12332

Voici ma solution, avec python et applescript :

  1. Installer appscript
  2. Exécuter appscript.app(pid=<yourpid>).activate()

C'est tout !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X