2010-01-19 32 views
9

¿Cómo puedo activar mediante programación 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)?Activación de la ventana de Python

+0

que realmente debería Dinos conjunto de herramientas GUI que está utilizando, ya que es posible que esta capacidad se encuentra en la caja de herramientas. –

+1

¿Tal vez está tratando de activar solo * cualquier * uno de la ventana abierta? –

Respuesta

26

Puede usar el módulo win32gui para hacerlo. Primero necesita obtener un control válido en su ventana. Puede usar el win32gui.FindWindow si conoce el nombre de la clase de ventana o el título exacto. De lo contrario, puede enumerar las ventanas con el win32gui.EnumWindows e intentar encontrar la correcta.

Una vez que tenga el asa, puede llamar al win32gui.SetForegroundWindow con el asa. 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))) is not None: 
      self._handle = hwnd 

    def find_window_wildcard(self, wildcard): 
     """find a window whose title matches the wildcard regex""" 
     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() 
+0

Esto no funciona cuando tiene varias instancias de la misma aplicación abierta al mismo tiempo, ya que no podría distinguirlas (ya que todo se basa en el título de la ventana). Es una verdadera lástima, pero supongo que esto es por el Win32API en lugar de este módulo de Python en particular? – dm76

+0

¿Existe una biblioteca similar para osx –

+1

que significa hwnd? (abreviaciones boo!) – NullVoxPopuli

4

Pywinauto y SWAPY que es probable la menor esfuerzo to set the focus of a window.

Uso SWAPY para generar automáticamente el código python necesaria para recuperar el objeto 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 es un problema. This additional code o this se asegurará de que se muestra 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() 
Cuestiones relacionadas