Obter outros tamanhos de janela processos em execução em Python
Pergunta
Isto não é tão maliciosa quanto parece, eu quero obter o tamanho atual de suas janelas, não olhar para o que está neles. O objetivo é descobrir que, se todos os outros janela é tela cheia, então eu deveria iniciar-se assim também. Ou se todos os outros processos são apenas 800x600 apesar de haver uma resolução enorme, então isso é provavelmente o que o usuário quer. Por que fazê-los perder tempo e energia redimensionar minha janela para coincidir com todos os outros que eles têm? Eu sou essencialmente um devoloper Windows, mas ele não iria me perturbar, no mínimo, se houvesse uma maneira de plataforma cruzada para fazer isso.
Solução
Usando referências de WindowMover artigo e post do Nattee Niparnan eu consegui criar esta:
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
Você precisa do Win32 extensões para Python módulo para que isso funcione.
EDIT: eu descobri que GetWindowRect
dá resultados mais corretos do que GetClientRect
. Fonte foi atualizado.
Outras dicas
Eu sou um grande fã de AutoIt . Eles têm uma versão COM que permite que você use a maioria de suas funções a partir 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
Confira o win32gui
módulo nas extensões do Windows para Python. Ele pode fornecer algumas das funcionalidades que você está procurando.