这并不像听起来那么恶意,我想获得他们当前的窗户大小,而不是看他们的内容。目的是弄清楚,如果每个其他窗口都是全屏的,那么我也应该这样开始。或者,如果所有其他进程只有800x600,尽管有一个巨大的分辨率,那么这可能是用户想要的。为什么让他们浪费时间和精力调整窗口大小以匹配他们拥有的所有其他人?我主要是一个Windows devoloper,但如果有一个跨平台的方法,它不会让我感到不安。
答案 0 :(得分:12)
使用来自WindowMover article和Nattee Niparnan's blog post的提示,我设法创建了这个:
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 module才能生效。
编辑:我发现GetWindowRect
提供的结果比GetClientRect
更正确。来源已更新。
答案 1 :(得分:8)
我是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
答案 2 :(得分:2)
查看适用于Python的Windows扩展中的win32gui
module。它可能会提供您正在寻找的一些功能。
答案 3 :(得分: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)