Get other running processes window sizes in Python

12,171

Solution 1

Using hints from WindowMover article and Nattee Niparnan's blog post I managed to create this:

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

You need the Win32 Extensions for Python module for this to work.

EDIT: I discovered that GetWindowRect gives more correct results than GetClientRect. Source has been updated.

Solution 2

I'm a big fan of AutoIt. They have a COM version which allows you to use most of their functions from 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

Solution 3

Check out the win32gui module in the Windows extensions for Python. It may provide some of the functionality you're looking for.

Share:
12,171
Brian Paden
Author by

Brian Paden

Just a SWE grad student.

Updated on July 28, 2022

Comments

  • Brian Paden
    Brian Paden almost 2 years

    This isn't as malicious as it sounds, I want to get the current size of their windows, not look at what is in them. The purpose is to figure out that if every other window is fullscreen then I should start up like that too. Or if all the other processes are only 800x600 despite there being a huge resolution then that is probably what the user wants. Why make them waste time and energy resizing my window to match all the others they have? I am primarily a Windows devoloper but it wouldn't upset me in the least if there was a cross platform way to do this.

  • sath garcia
    sath garcia over 15 years
    +1 for providing your original sources. I always enjoy finding out what other people are reading.
  • seler
    seler almost 12 years
    Any suggestions on how to do it under linux (preferably gnome)?
  • David
    David over 9 years
    Does AutoIt over win32com.client have a slightly differing API? Based on AutoIt function reference that applies to COM, oAutoItX.Opt() should be oAutoItX.AutoItSetOption(), and oAutoItX.WinGetClientSizeWidth() and oAutoItX.WinGetClientSizeHeight() should actually be one method/function oAutoItX.WinGetClientSize() that returns a 2 item tuple or list containing the width (1st index) & height (2nd index).
  • David
    David over 9 years
    If we're talking AutoIt and Python, there's also a wrapper for it w/o going through win32com directly: github.com/jacexh/pyautoit, see also pypi.python.org/pypi/PyAutoIt/0.3.
  • Dustin Wyatt
    Dustin Wyatt over 9 years
    @David, I answered this 6 1/2 years ago! From the AutoItX Help file for AutoItSetOption: "You may use Opt as an alternative to AutoItSetOption." And there is no WinGetClientSize, just WinGetClientSizeWidth and WinGetClientSideHeight. Are you sure you're looking at the AutoItX documentation?
  • David
    David over 9 years
    Maybe there's a discrepancy between the CHM help file vs online docs, or there's been a change in later versions of AutoIt? I refer to version 3. Which version does your example refer to? I just checked v3's CHM file and online docs, and there is only WinGetClientSize. See autoitscript.com/autoit3/docs/functions/WinGetClientSize.htm‌​. But you are right about Opt function. I overlooked that alternative alias mentioned in AutoItSetOption: autoitscript.com/autoit3/docs/functions/AutoItSetOption.htm
  • Dustin Wyatt
    Dustin Wyatt over 9 years
    Those are the docs for AutoIt, not AutoItX. AutoItX is (from help file): "a DLL version of AutoIt v3 that provides a subset of the features of AutoIt via an ActiveX/COM and DLL interface." AutoItX and it's help file is packaged with the main AutoIt download. I am referring to version 3.3.12.0
  • David
    David over 9 years
    Thanks, good to know. I see what you mean now. I wonder why they don't just post a copy of the COM docs online too. The interesting thing is that the function reference for AutoIt is for the most part the same for AutoItX, save for some differences like WinGetClientSize. When I was using AutoIt some time back, I just used the online function ref for my VBScripts using COM, and worked fine for me since I didn't come across a differenting function like WinGetClientSize.
  • 0x48piraj
    0x48piraj almost 6 years
    It gives something like (1378864, (677, 522)), how to target an application, for example notepad.exe ?