Solución:
No me gustan estas sugerencias de uso win32gui
porque no puedes instalarlo fácilmente a través de pip
. Entonces esta es mi solución:
Primero, instale pywinauto
vía pip
. Si está en Python 2.7.9 o una versión más reciente en la rama 2, o Python 3.4.0 o una versión más nueva de la rama 3, pip
ya está instalado. Para todos los demás, actualice Python para obtenerlo (o puede descargarlo e instalarlo manualmente ejecutando este script, si debe ejecutar una versión anterior de Python).
Simplemente ejecute esto desde la línea de comando (no desde dentro de Python):
pip install pywinauto
A continuación, importe lo que necesita de pywinauto
:
from pywinauto.findwindows import find_window
from pywinauto.win32functions import SetForegroundWindow
Finalmente, es solo una línea real:
SetForegroundWindow(find_window(title="taskeng.exe"))
He tenido un código que se ha estado ejecutando durante años, que se remonta a Windows 95. Al hacer doble clic en el ícono de la bandeja del sistema de aplicaciones, siempre usé funciones de API de Win32 como BringWindowToTop y SetForegroundWindow para traer las ventanas de mi aplicación al primer plano. Todo esto dejó de funcionar como se esperaba en Windows 7, donde mi ventana de entrada terminaría detrás de otras ventanas y el icono de la ventana parpadearía en la barra de estado. El “trabajo alrededor” que se me ocurrió fue este; y parece funcionar en todas las versiones de Windows.
//-- show the window as you normally would, and bring window to foreground.
// for example;
::ShowWindow(hWnd,SW_SHOW);
::BringWindowToTop(hWnd);
::SetForegroundWindow(hWnd);
//-- on Windows 7, this workaround brings window to top
::SetWindowPos(hWnd,HWND_NOTOPMOST,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);
::SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);
::SetWindowPos(hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
Según nspire, probé su solución con python 2.7 y W8, y funciona a las mil maravillas, incluso si la ventana está minimizada *.
win32gui.ShowWindow(HWND, win32con.SW_RESTORE)
win32gui.SetWindowPos(HWND,win32con.HWND_NOTOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE + win32con.SWP_NOSIZE)
win32gui.SetWindowPos(HWND,win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE + win32con.SWP_NOSIZE)
win32gui.SetWindowPos(HWND,win32con.HWND_NOTOPMOST, 0, 0, 0, 0, win32con.SWP_SHOWWINDOW + win32con.SWP_NOMOVE + win32con.SWP_NOSIZE)
- Originalmente fue si la ventana no esta minimizada, pero gracias a Quiencomentario de
win32gui.ShowWindow(HWND, win32con.SW_RESTORE)
, ahora funciona en todas las situaciones.