Get other running processes window sizes in Python

后端 未结 4 572
滥情空心
滥情空心 2020-11-30 04:40

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

相关标签:
4条回答
  • 2020-11-30 04:52

    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
    
    0 讨论(0)
  • 2020-11-30 04:52

    I updated the GREAT @DZinX code adding the title/text of the windows:

    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)
        text = win32gui.GetWindowText(hWnd)
        windows.append((hWnd, (rect[2] - rect[0], rect[3] - rect[1]), text ))
    windows = []
    win32gui.EnumWindows(callback, windows)
    return windows
    
    for win in getWindowSizes():
    print(win)
    
    0 讨论(0)
  • 2020-11-30 05:03

    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.

    0 讨论(0)
  • 2020-11-30 05:05

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

    0 讨论(0)
提交回复
热议问题