Foros Python

Versión completa: Detalle procesos con psutil
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola,

Utilizando el módulo psutil obtengo el detalle de los procesos en memoria de Acrobar Reader:

def find_procs_by_name(name):
    "Return a list of processes matching 'name'."
    ls = []
    for p in psutil.process_iter(['name']):
        if p.info['name'] == name:
            ls.append(p)
    return ls  


Salida:
[psutil.Process(pid=5576, name='AcroRd32.exe', started='19:22:22'), psutil.Process(pid=10876, name='AcroRd32.exe', started='19:22:23')]

Lo que quisiera saber es si a partir de esa información puedo obtener el nombre del archivo (pdf) que está abriendo el Acrobat, tal como figura en la imagen adjunta.

Muchas gracias!

Saludos,

Raúl
Hola Raúl.

psutil no provee ninguna función para eso. Se me ocurre que se puede obtener el nombre del archivo leyendo el título de la ventana principal del proceso (considerando que eso es lo que muestra el administrador de tareas) usando la API de Windows:

Código:
from win32con import WM_GETTEXT
import win32gui
import win32process

def get_main_window_name(p):
    handles = []
    win32gui.EnumWindows(lambda hwnd, _: handles.append(hwnd), 0)
    title_buffer = win32gui.PyMakeBuffer(256)
    for handle in handles:
        [_, pid] = win32process.GetWindowThreadProcessId(handle)
        if pid == p.pid:
            length = win32gui.SendMessage(
                handle, WM_GETTEXT, len(title_buffer), title_buffer
            )
            return title_buffer.tobytes()[:length * 2].decode("utf16")

Ejemplo:

Código:
for p in find_procs_by_name("AcroRd32.exe"):
    print(get_main_window_name(p))

El código requiere pywin32.

Saludos!
OK, muchas gracias Francisco !!!