8

这并不像听起来那么恶意,我想获取他们窗口的当前大小,而不是查看其中的内容。目的是弄清楚如果每个其他窗口都是全屏的,那么我也应该这样启动。或者,如果所有其他进程只有 800x600,尽管分辨率很高,那么这可能就是用户想要的。为什么要让他们浪费时间和精力来调整我的窗口大小以匹配他们拥有的所有其他窗口?我主要是一个 Windows 开发者,但如果有跨平台的方式来做到这一点,它至少不会让我感到不安。

4

5 回答 5

12

使用WindowMover 文章Nattee Niparnan 的博客文章中的提示,我设法创建了这个:

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

为此,您需要Win32 Extensions for Python 模块

编辑:我发现它GetWindowRect给出的结果比GetClientRect. 源已更新。

于 2008-09-30T10:02:38.250 回答
9

我是AutoIt的忠实粉丝。他们有一个 COM 版本,允许您从 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
于 2008-09-30T23:30:58.247 回答
2

查看 Python 的 Windows 扩展中的win32gui模块。它可能会提供您正在寻找的一些功能。

于 2008-09-30T07:35:04.267 回答
0

我更新了 GREAT @DZinX 代码,添加了窗口的标题/文本:

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)
于 2020-02-25T10:17:50.213 回答
0

我修改某人的代码,

这很好地帮助运行其他应用程序并获取 PID,

import win32process
import subprocess
import win32gui
import time 
 
def get_hwnds_for_pid (pid):
  def callback (hwnd, hwnds):
    if win32gui.IsWindowVisible (hwnd) and win32gui.IsWindowEnabled (hwnd):
      _, found_pid = win32process.GetWindowThreadProcessId (hwnd)
      if found_pid == pid:
        hwnds.append (hwnd)
    return True
    
  hwnds = []
  win32gui.EnumWindows (callback, hwnds)
  return hwnds

# This the process I want to get windows size. 
notepad = subprocess.Popen ([r"C:\\Users\\dniwa\\Adb\\scrcpy.exe"]) 
time.sleep (2.0)

while True: 
  for hwnd in get_hwnds_for_pid (notepad.pid):
    rect = win32gui.GetWindowRect(hwnd)
    print(hwnd, "=>", win32gui.GetWindowText (hwnd))

    # You need to test if your resolution really get exactly because mine is doesn't . 
    # I use . 16:9 Monitor , Calculate the percent using this calculations , , (x * .0204082) and (y * .0115774)
    print((hwnd, (rect[2] - rect[0], rect[3] - rect[1])))
    x = rect[2] - rect[0]
    y = rect[3] - rect[1]
    print(type(x), type(y))
    time.sleep(1)
于 2021-10-18T03:25:14.437 回答