Volver al blog

Cómo saber qué proceso posee una ventana en macOS

Descubre las formas más rápidas de identificar qué proceso de macOS posee una ventana concreta usando Activity Monitor, las APIs de ventanas de Quartz, el Terminal y ProcXray.

Si alguna vez te has quedado mirando un cuadro de diálogo flotante, una ventana de inicio de sesión bloqueada o una ventana emergente misteriosa en macOS y te has preguntado qué proceso creó esa ventana, no eres el único. La respuesta no es evidente desde el Finder ni el Dock, y Activity Monitor solo ayuda hasta cierto punto.

Respuesta rápida

La forma integrada más fiable de averiguar qué proceso posee una ventana concreta en macOS es consultar Quartz Window Services con CGWindowListCopyWindowInfo, leer el kCGWindowOwnerPID de la ventana y, a continuación, inspeccionar ese PID con ps. Activity Monitor puede acotar la búsqueda, pero Quartz proporciona la correspondencia precisa entre ventana y proceso.

Por qué esto es más difícil de lo que parece en macOS

macOS no ofrece una función obvia del tipo «haz clic derecho en esta ventana y muéstrame el PID». Una sola app puede poseer varias ventanas, varios procesos auxiliares y varios agentes en segundo plano. Además, algunas ventanas no tienen título visible, lo que hace que las conjeturas manuales sean poco fiables.

La documentación de Apple explica por qué. En un diccionario de información de ventana, kCGWindowOwnerPID es una clave obligatoria, mientras que kCGWindowOwnerName y kCGWindowName son opcionales. Eso significa que el PID del propietario es fiable, mientras que el nombre de la app y el título de la ventana pueden faltar en algunas ventanas.

Método 1: usa Activity Monitor cuando ya sabes qué app es

Si ya puedes deducir qué app creó la ventana, Activity Monitor es la herramienta gráfica integrada más rápida para confirmar el proceso.

Cómo acotar la lista

  1. Abre Activity Monitor desde /Applications/Utilities/.
  2. Elige View > Windowed Processes para mostrar los procesos capaces de crear ventanas.
  3. Si necesitas contexto de relación padre-hijo, elige View > All Processes, Hierarchically.
  4. Busca el nombre de la app y luego abre su panel de información o anota su PID.

Esto resulta útil para casos comunes como «¿este pop-up viene de Safari, Slack o de una app auxiliar?».

Cuándo Activity Monitor se queda corto

Activity Monitor muestra procesos capaces de crear ventanas, no una correspondencia directa entre esta ventana exacta y ese PID exacto. Se vuelve mucho menos fiable cuando:

Para la propiedad exacta de la ventana, usa Quartz.

Método 2: usa Quartz Window Services para asignar ventanas a PIDs

La API de Core Graphics de Apple CGWindowListCopyWindowInfo devuelve metadatos de las ventanas en pantalla, incluido el PID propietario. Puedes invocarla directamente desde un breve comando de Swift sin crear una app completa.

Lista las ventanas visibles con su proceso propietario

swift -e '
import Foundation
import CoreGraphics

let query = CommandLine.arguments.dropFirst().joined(separator: " ").lowercased()
let windows = CGWindowListCopyWindowInfo(
  [.optionOnScreenOnly, .excludeDesktopElements],
  kCGNullWindowID
) as? [[String: Any]] ?? []

for window in windows {
  let owner = (window[kCGWindowOwnerName as String] as? String) ?? ""
  let pid = (window[kCGWindowOwnerPID as String] as? Int) ?? 0
  let title = (window[kCGWindowName as String] as? String) ?? ""

  guard !owner.isEmpty else { continue }
  guard query.isEmpty ||
    owner.lowercased().contains(query) ||
    title.lowercased().contains(query) else { continue }

  print("PID: \(pid)\tApp: \(owner)\tWindow: \(title)")
}
' "Safari"

Sustituye "Safari" por parte del nombre de la app o del título de la ventana que intentas identificar. Si omites el término de búsqueda, el comando imprime todas las ventanas actualmente visibles que puede enumerar.

Qué te dice la salida

Este es el mejor enfoque integrado cuando tu verdadera pregunta es «¿Qué proceso posee esta ventana exacta?».

Inspecciona el proceso una vez que tengas el PID

Una vez que tengas el PID, usa ps para confirmar el ejecutable y la línea de comandos:

ps -p <PID> -o pid,ppid,comm,args

Ejemplo:

ps -p 1234 -o pid,ppid,comm,args

Esto te permite pasar de una ventana sospechosa al binario exacto, al proceso padre y a los argumentos de arranque.

Advertencias importantes

Método 3: usa ProcXray para investigaciones interactivas

Si haces esto a menudo, los comandos en bruto se vuelven tediosos. ProcXray es mejor cuando necesitas pasar rápidamente de una ventana misteriosa al contexto completo del proceso.

Por qué ProcXray es mejor para depurar de forma recurrente

Si la ventana pertenece a un proceso auxiliar, un actualizador o una herramienta transitoria en segundo plano, ese contexto importa más que el PID por sí solo.

Quizá también te interesen estas guías relacionadas:

Activity Monitor frente a Quartz frente a ProcXray

MétodoIdeal paraPuntos fuertesLimitaciones
Activity MonitorConfirmación visual rápidaIntegrado, fácil de usar, muestra los PIDsNo asigna una ventana arbitraria directamente a su propietario
Consulta de ventanas con QuartzBúsqueda exacta de ventana a PIDAPI oficial, automatizable, precisaLa salida en bruto requiere seguimiento manual
ProcXrayInvestigaciones reales y depuración recurrenteAñade linaje, variables de entorno, firmas y visibilidad de procesos efímerosRequiere instalar otra app

En resumen: si necesitas una respuesta exacta una sola vez, usa la consulta de Quartz. Si investigas ventanas, procesos auxiliares y procesos efímeros de forma habitual, usa ProcXray.

Preguntas frecuentes

¿Puede Activity Monitor mostrar qué proceso posee una ventana concreta en macOS?

No directamente. Activity Monitor puede filtrar por Windowed Processes y ayudarte a inspeccionar los procesos de app más probables, pero no ofrece una asignación con un solo clic de una sola ventana a su PID exacto. Quartz Window Services es el método integrado más preciso.

¿Cuál es la API oficial de Apple para encontrar el proceso propietario de una ventana?

Apple documenta CGWindowListCopyWindowInfo como la función de Core Graphics para recuperar metadatos de ventanas. El diccionario devuelto incluye kCGWindowOwnerPID como clave obligatoria, lo que lo convierte en el campo canónico para asignar una ventana a su proceso propietario.

¿Por qué a veces el título de una ventana de macOS está en blanco?

Porque kCGWindowName es opcional, no está garantizado. Algunas ventanas exponen el PID del propietario, pero no un título visible para el usuario. Esto es normal en muchas ventanas de utilidades, superposiciones del sistema y superficies de apps protegidas.

Después de encontrar el PID, ¿qué debo hacer a continuación?

Ejecuta ps -p <PID> -o pid,ppid,comm,args para confirmar la ruta del ejecutable, el proceso padre y los argumentos de la línea de comandos. Si el proceso sigue pareciendo sospechoso, inspecciona a continuación sus descriptores de archivo, su actividad de red y su firma de código.

Fuentes y referencias

Descarga ProcXray gratis → — una forma más rápida de investigar el proceso que hay detrás de una ventana sospechosa.