Python y gestión de ventanas Windows con PyWin32 – 1 listar ventanas en ejecución

No soy de Windows, pero a veces toca acceder a uno para ciertas tareas.

PyWin32 es un potente API que permite acceder a todo el sistema Windows: info del sistema, interface de usuario, sistema de archivos, registro, …

El módulo que nos permitirá controlar la interface gráfica de windows es win32gui. En este caso, vamos a ver un ejemplo sencillo y recuperar las ventanas de aplicaciones en ejecución.

Instalación de PyWin32 en SO Windows

Instalamos como siempre con pip. Desde el shell:

pip install pywin32

Si estás tras un proxy debes indicarlo en la instrucción, seria algo así:

pip install pywin32 --proxy https://altaruru:mipassword@proxy.altaruru.com:8080

* Puedes ver la entrada para instalar con pip tras un proxy aquí

Una vez instalado tendremos acceso a un montón de funciones para gestionar al «ventanucos», obtener info de que se está ejecutando y matar procesos, interactuar con las aplicaciones…

Ejemplo 1, obtener lista de ventanas en ejecución

Echad un ojo al código y lo comentamos:

import win32gui
 
def loadwindowslist(hwnd, topwindows):
	topwindows.append((hwnd, win32gui.GetWindowText(hwnd)))

def showwindowslist():
	topwindows = []
	win32gui.EnumWindows(loadwindowslist, topwindows)
	for hwin in topwindows:	
		sappname=str(hwin[1])
		nhwnd=hwin[0]
		print(str(nhwnd) + ": " + sappname)

showwindowslist()

Importamos win32gui, módulo que nos dará acceso a las funciones de manejo de ventanas.

Creamos dos funciones::

  • loadwindowslist()
  • showwindowslist()

La función principal es showwindowslist(), esta a su vez llama a loadwindowslist() para recuperar la info necesaria para mostrarla.

El código no necesita mucha explicación, quizá, la única mención importante sea la llamada a win32gui.EnumWindows(), donde uno de los parámetros requeridos debe ser otra función, y es donde utilizamos nuestra loadwindowslist.

Ejemplo 2, encontrar y poner en primer plano una aplicación.

def findandshowwindow(swinname, bshow, bbreak):
	topwindows = []
	win32gui.EnumWindows(loadwindowslist, topwindows)
	for hwin in topwindows:	
		sappname=str(hwin[1])
		if swinname in sappname.lower():	
			nhwnd=hwin[0]
			print(">>> Found: " + str(nhwnd) + ": " + sappname)
			if(bshow):
				win32gui.ShowWindow(nhwnd,5)
				win32gui.SetForegroundWindow(nhwnd)
			if(bbreak):
				break

Bien, la función anterior localizará una o varias aplicaciones por su nombre o parte del mismo.

La base es la misma que vimos anteriormente, obtenemos la lista completa de ventanas activas y filtramos por nombre.

Como añadido es posible pasar como parámetro boolean bshow, siendo True muestra ventana en primer plano, y bbreak que interrumpe la búsqueda al encontrar la primera coincidencia.

Ejemplos de uso:

Si quiero saber si se esta ejecutando el notepad:

findandshowwindow("notepad", False, True)

Si además quiero mostrarla en primer plano, pongo a True el segundo parámetro:

findandshowwindow("notepad", True, True)

Para listar todas las apps con pdfs abiertos, el nombre del pdf está en la ventana de título:

findandshowwindow(".pdf", False, False)

O aquellas apps de google como el Chrome:

findandshowwindow("google", False, False)

Conclusiones

Las posibilidades de uso de esta API son enormes, administración, informes remotos de actividad…

Si bien es una breve intro porque el API da para mucho, por algo hay que empezar. Más adelante seguiremos con otros casos de uso comunes.

Espero sea de utilidad! Saludos!

Deja un comentario

Tu dirección de correo electrónico no será publicada.