python - cómo - ejecutar archivos.py desde terminal
Activación de la ventana de Python (2)
¿Cómo activaría programáticamente una ventana en Windows usando Python? Le estoy enviando pulsaciones de teclas y en este momento solo me estoy asegurando de que sea la última aplicación utilizada y luego envíe la combinación de teclas Alt + Tab para cambiar desde la consola de DOS. ¿Hay una mejor manera (ya que he aprendido por experiencia que de esta manera no es de ninguna manera infalible)?
Puedes usar el módulo win32gui para hacer eso. Primero necesita obtener un control válido en su ventana. Puede usar win32gui.FindWindow
si conoce el nombre de la clase de ventana o el título exacto. Si no, puede enumerar las ventanas con win32gui.EnumWindows
e intentar encontrar la correcta.
Una vez que tenga el control, puede llamar a win32gui.SetForegroundWindow
con el controlador. Se activará la ventana y estará listo para obtener sus pulsaciones de teclas.
Vea un ejemplo a continuación. Espero que ayude
import win32gui
import re
class WindowMgr:
"""Encapsulates some calls to the winapi for window management"""
def __init__ (self):
"""Constructor"""
self._handle = None
def find_window(self, class_name, window_name = None):
"""find a window by its class_name"""
self._handle = win32gui.FindWindow(class_name, window_name)
def _window_enum_callback(self, hwnd, wildcard):
''''''Pass to win32gui.EnumWindows() to check all the opened windows''''''
if re.match(wildcard, str(win32gui.GetWindowText(hwnd))) != None:
self._handle = hwnd
def find_window_wildcard(self, wildcard):
self._handle = None
win32gui.EnumWindows(self._window_enum_callback, wildcard)
def set_foreground(self):
"""put the window in the foreground"""
win32gui.SetForegroundWindow(self._handle)
w = WindowMgr()
w.find_window_wildcard(".*Hello.*")
w.set_foreground()
Pywinauto y SWAPY probablemente requerirán el menor esfuerzo para establecer el foco de una ventana .
Use SWAPY para generar automáticamente el código python necesario para recuperar el objeto de la ventana, por ejemplo:
import pywinauto
# SWAPY will record the title and class of the window you want activated
app = pywinauto.application.Application()
t, c = u''WINDOW SWAPY RECORDS'', u''CLASS SWAPY RECORDS''
handle = pywinauto.findwindows.find_windows(title=t, class_name=c)[0]
# SWAPY will also get the window
window = app.window_(handle=handle)
# this here is the only line of code you actually write (SWAPY recorded the rest)
window.SetFocus()
Si por casualidad otras ventanas están en frente de la ventana de interés, no hay problema. Este código adicional o este se asegurará de que se muestre antes de ejecutar el código anterior:
# minimize then maximize to bring this window in front of all others
window.Minimize()
window.Maximize()
# now you can set its focus
window.SetFocus()