windows 用python获取窗口位置和大小

gxwragnw  于 2023-03-09  发布在  Windows
关注(0)|答案(7)|浏览(834)

我如何用python获取和设置窗口(任何windows程序)的位置和大小?

tvz2xvvm

tvz2xvvm1#

假设您使用的是Windows,请尝试使用pywin32win32gui模块及其EnumWindowsGetWindowRect函数。
如果您使用的是Mac OS X,可以尝试使用appscript
对于Linux,您可以尝试X11的许多接口中的一个。

**编辑:**Windows示例(未测试):

import win32gui

def callback(hwnd, extra):
    rect = win32gui.GetWindowRect(hwnd)
    x = rect[0]
    y = rect[1]
    w = rect[2] - x
    h = rect[3] - y
    print("Window %s:" % win32gui.GetWindowText(hwnd))
    print("\tLocation: (%d, %d)" % (x, y))
    print("\t    Size: (%d, %d)" % (w, h))

def main():
    win32gui.EnumWindows(callback, None)

if __name__ == '__main__':
    main()
5uzkadbs

5uzkadbs2#

可以使用GetWindowRect函数获取窗口坐标,为此,需要一个窗口句柄,可以使用FindWindow获取,前提是您了解该窗口的一些信息(例如它的标题)。
要从Python调用Win32 API函数,请使用pywin32

zte4gxcn

zte4gxcn3#

正如Greg Hewgill提到的,如果知道窗口的名称,可以简单地使用win32gui的FindWindow和GetWindowRect,这可能比以前的方法更干净和高效。

from win32gui import FindWindow, GetWindowRect

# FindWindow takes the Window Class name (can be None if unknown), and the window's display text. 
window_handle = FindWindow(None, "Diablo II")
window_rect   = GetWindowRect(window_handle)

print(window_rect)
#(0, 0, 800, 600)

供日后参考:PyWin32GUI现在已经迁移到Github

nlejzf6q

nlejzf6q4#

这可以从窗口标题返回窗口矩形

代码

def GetWindowRectFromName(name:str)-> tuple:
    hwnd = ctypes.windll.user32.FindWindowW(0, name)
    rect = ctypes.wintypes.RECT()
    ctypes.windll.user32.GetWindowRect(hwnd, ctypes.pointer(rect))
    # print(hwnd)
    # print(rect)
    return (rect.left, rect.top, rect.right, rect.bottom)

if __name__ == "__main__":
    print(GetWindowRectFromName('CALC'))
    pass

环境
Python 3.8.2语言|由Conda-Forge Package |(默认值,2020年4月24日07:34:03)[MSC v.1916 64位(AMD64)],Windows 10专业版1909,基于win32

nwnhqdif

nwnhqdif5#

对于Linux,您可以使用我制作的工具here。该工具的用途略有不同,但您可以根据需要直接使用API。
安装工具

sudo apt-get install xdotool xprop xwininfo
git clone https://github.com/Pithikos/winlaunch.git && cd winlaunch

终端内

>>> from winlaunch import *
>>> wid, pid = launch('firefox')
>>> win_pos(wid)
[3210, 726]

widpid分别代表窗口ID和进程ID。

carvr3hs

carvr3hs6#

这段代码可以在窗口上工作。它返回当前窗口的位置和大小。

from win32gui import GetWindowText, GetForegroundWindow
print(GetWindowRect(GetForegroundWindow()))
yvgpqqbh

yvgpqqbh7#

在其他回复中没有提到的是,在较新的Windows(Vista及以上版本)中,“窗口矩形现在包括投影所占用的区域。"这是win32gui.GetWindowRectctypes.windll.user32.GetWindowRect所对接的。
如果您想在不使用投影的情况下获得位置和大小,您可以:
1.手动删除它们。在我的例子中,左、下、右各有10个像素需要修剪。
1.使用dwmapi提取本文中提到的DWMWA_EXTENDED_FRAME_BOUNDS
使用dwmapi.DwmGetWindowAttribute时(请参阅here):
此函数有四个参数:hwnd,我们感兴趣的属性的标识符,写入属性的数据结构的指针,这个数据结构的大小,通过检查this enum得到的标识符,在我们的例子中,属性DWMWA_EXTENDED_FRAME_BOUNDS在位置9。

import ctypes
from ctypes.wintypes import HWND, DWORD, RECT

dwmapi = ctypes.WinDLL("dwmapi")

hwnd = 133116    # refer to the other answers on how to find the hwnd of your window

rect = RECT()
DMWA_EXTENDED_FRAME_BOUNDS = 9
dwmapi.DwmGetWindowAttribute(HWND(hwnd), DWORD(DMWA_EXTENDED_FRAME_BOUNDS),
                             ctypes.byref(rect), ctypes.sizeof(rect))

print(rect.left, rect.top, rect.right, rect.bottom)

最后:“注意,与窗口矩形不同,DWM扩展帧边界不会针对DPI进行调整”。

相关问题