Windows API – Mantener ventana siempre al frente

Versión: 2.x, 3.x.
Descargas: alwaysontop.zip.

Simple código que utiliza las funciones de la API de Windows FindWindow (en su versión Unicode, FindWindowW) y SetWindowPos para, respectivamente, obtener el número identificador de una ventana específica (determinada a partir del título) y luego enviarla y mantenerla al frente, por más que pierda el foco.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#       alwaysontop.py
#       
#       Copyright 2014 Recursos Python - www.recursospython.com
#       

from ctypes import c_void_p, windll
from platform import python_version_tuple
from sys import stdin


# Constantes.
SWP_NOMOVE = 0x0002
SWP_NOSIZE = 0x0001


def main():
    # Compatibilidad entre versiones.
    py_version = int(python_version_tuple()[0])
    prompt = raw_input if py_version == 2 else input
    
    # Nombre de la ventana.
    window_name = ""
    # Identificador.
    handle = 0
    
    while not window_name or not handle:
        window_name = prompt("Nombre de la ventana: ")
        
        # Convertir a Unicode en Python 2.
        if py_version == 2:
            window_name = window_name.decode(stdin.encoding)
        
        handle = windll.user32.FindWindowW(None, window_name)
    
    # Enviar ventana al frente.
    windll.user32.SetWindowPos(handle, c_void_p(-1), 0, 0, 0, 0,
                               SWP_NOMOVE | SWP_NOSIZE)


if __name__ == "__main__":
    main()

A continuación, un código análogo que utiliza el módulo pywin32:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#       alwaysontop_pywin32.py
#       
#       Copyright 2014 Recursos Python - www.recursospython.com
#       

from platform import python_version_tuple
from sys import stdin

from win32con import SWP_NOMOVE, SWP_NOSIZE
from win32gui import FindWindow, SetWindowPos


def main():
    py_version = int(python_version_tuple()[0])
    prompt = raw_input if py_version == 2 else input
    
    window_name = ""
    handle = 0
    
    while not window_name or not handle:
        window_name = prompt("Nombre de la ventana: ")
        
        if py_version == 2:
            window_name = window_name.decode(stdin.encoding)
        
        handle = FindWindow(None, window_name)
    
    SetWindowPos(handle, -1, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE)


if __name__ == "__main__":
    main()

Curso online 👨‍💻

¡Ya lanzamos el curso oficial de Recursos Python en Udemy! Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.

Consultoría 💡

Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.

Deja una respuesta