2008-09-30 3 views
9

Ce n'est pas aussi méchant que cela puisse paraître, je veux obtenir la taille actuelle de leurs fenêtres, pas regarder ce qui est en eux. Le but est de comprendre que si toutes les autres fenêtres sont en plein écran, je devrais démarrer comme ça aussi. Ou si tous les autres processus ne sont que 800x600 malgré une résolution énorme, c'est probablement ce que l'utilisateur veut. Pourquoi leur faire perdre du temps et de l'énergie à redimensionner ma fenêtre pour qu'elle corresponde à toutes les autres? Je suis principalement un devoloper de Windows mais cela ne me dérangerait pas du tout s'il y avait un moyen multi-plateforme de le faire.Obtenez d'autres tailles de fenêtres de processus en cours d'exécution en Python

Répondre

12

Utilisation des notes de WindowMover article et je Nattee Niparnan's blog post réussi à créer cette:

import win32con 
import win32gui 

def isRealWindow(hWnd): 
    '''Return True iff given window is a real Windows application window.''' 
    if not win32gui.IsWindowVisible(hWnd): 
     return False 
    if win32gui.GetParent(hWnd) != 0: 
     return False 
    hasNoOwner = win32gui.GetWindow(hWnd, win32con.GW_OWNER) == 0 
    lExStyle = win32gui.GetWindowLong(hWnd, win32con.GWL_EXSTYLE) 
    if (((lExStyle & win32con.WS_EX_TOOLWINDOW) == 0 and hasNoOwner) 
     or ((lExStyle & win32con.WS_EX_APPWINDOW != 0) and not hasNoOwner)): 
     if win32gui.GetWindowText(hWnd): 
      return True 
    return False 

def getWindowSizes(): 
    ''' 
    Return a list of tuples (handler, (width, height)) for each real window. 
    ''' 
    def callback(hWnd, windows): 
     if not isRealWindow(hWnd): 
      return 
     rect = win32gui.GetWindowRect(hWnd) 
     windows.append((hWnd, (rect[2] - rect[0], rect[3] - rect[1]))) 
    windows = [] 
    win32gui.EnumWindows(callback, windows) 
    return windows 

for win in getWindowSizes(): 
    print win 

Vous devez le Win32 Extensions for Python module pour que cela fonctionne.

EDIT: J'ai découvert que GetWindowRect donne plus de résultats corrects que GetClientRect. La source a été mise à jour.

+0

+1 pour fournir vos sources d'origine. J'aime toujours découvrir ce que les autres lisent. – technomalogical

+0

Des suggestions sur la façon de le faire sous Linux (de préférence gnome)? – seler

2

Consultez les win32gui module dans les extensions Windows pour Python. Il peut fournir certaines des fonctionnalités que vous recherchez.

8

Je suis un grand fan de AutoIt. Ils ont une version COM qui vous permet d'utiliser la plupart de leurs fonctions de Python.

import win32com.client 
oAutoItX = win32com.client.Dispatch("AutoItX3.Control") 

oAutoItX.Opt("WinTitleMatchMode", 2) #Match text anywhere in a window title 

width = oAutoItX.WinGetClientSizeWidth("Firefox") 
height = oAutoItX.WinGetClientSizeHeight("Firefox") 

print width, height 
+0

Est-ce que AutoIt over win32com.client a une API légèrement différente? Basé sur la référence de fonction AutoIt qui s'applique à COM, oAutoItX.Opt() devrait être oAutoItX.AutoItSetOption(), et oAutoItX.WinGetClientSizeWidth() et oAutoItX.WinGetClientSizeHeight() devrait en fait être une méthode/fonction oAutoItX.WinGetClientSize() qui retourne un Tuple de 2 articles ou liste contenant la largeur (1er index) et la hauteur (2ème index). – David

+1

Si nous parlons d'AutoIt et de Python, il y a aussi un wrapper pour cela sans passer directement par win32com: https://github.com/jacexh/pyautoit, voir aussi https://pypi.python.org/pypi/ PyAutoIt/0.3. – David

+0

@David, j'ai répondu il y a 6 ans et demi! A partir du fichier d'aide AutoItX pour AutoItSetOption: "Vous pouvez utiliser Opt comme alternative à AutoItSetOption." Et il n'y a pas WinGetClientSize, juste WinGetClientSizeWidth et WinGetClientSideHeight. Êtes-vous sûr de consulter la documentation AutoItX? –

Questions connexes