Window:Windows 窗口自动化核心类
Window 类提供了对 Windows 窗口最全面的控制能力,支持后台点击、输入、精准坐标控制及高清截图。
1. 导入模块
在开始编写代码前,请先导入核心类及相关枚举:
# 导入窗口操作核心类及截图格式枚举
from ascript.windows.window import Window
2. 静态方法(找窗口、开程序)
🔍 批量查找 find_all()
扫描当前系统中所有满足条件的窗口。
代码块:
# 扫描并返回满足条件的窗口对象列表
Window.find_all(title_re=None, process_name=None, class_name=None, visible_only=True)
参数详解:
- title_re (str): 窗口标题的正则表达式。
- process_name (str): 进程名称(如
"chrome.exe") ,匹配时忽略大小写。 - class_name (str): 窗口的系统类名(ClassName),需完全匹配。
- visible_only (bool): 是否只匹配当前对用户可见的窗口。默认为
True。
案例:
# 找到所有名为“微信”的窗口并打印它们的句柄
wins = Window.find_all(title_re="微信")
for w in wins:
print(f"找到句柄: {w.hwnd}")
🎯 快速检索 find()
查找并返回满足条件的第一个窗口。
代码块:
# 查找满足条件的第一个窗口对象
Window.find(title_re=None, process_name=None, class_name=None, visible_only=True, timeout=0)
参数详解:
- title_re (str): 窗口标题的正则表达式。
- process_name (str): 进程名称。
- class_name (str): 窗口的系统类名。
- visible_only (bool): 是否只匹配可见窗口。
- timeout (int): 检索超时时间(秒)。为
0时立即返回;大于0时将以 0.5s 为间隔持续轮询。
案例:
# 等待记事本打开,最多等 10 秒
win = Window.find(process_name="notepad.exe", timeout=10)
⚡ 启动程序 launch()
启动目标程序,并自动获取其窗口对象。
代码块:
# 启动程序并自动关联窗口
Window.launch(name=None, path=None, allow_multiple=False, timeout=15)
参数详解:
- name (str): 程序标识名。
- path (str): 程序可执行文件的完整物理路径。
- allow_multiple (bool): 是否允许启动多个实例。若为
False且程序已运行,则直接唤醒现有窗口。 - timeout (int): 等待新窗口生成的超时秒数。
案例:
# 启动记事本
win = Window.launch(path="notepad.exe")
3. 实例方法(窗口操控)
3.1 布局控制
📐 综合调整 set_rect()
统一修改窗口的位置和大小。
代码块:
# 调整窗口的坐标和宽高
win.set_rect(x=None, y=None, width=None, height=None)
参数详解:
- x (int): 目标左上角 X 轴坐标。为
None则保持当前位置。 - y (int): 目标左上角 Y 轴坐标。为
None则保持当前位置。 - width (int): 目标宽度。为
None则保持当前数值。 - height (int): 目标高度。为
None则保持当前数值。
案例:
# 将窗口移动到 (100, 100) 并设置宽高为 800x600
win.set_rect(x=100, y=100, width=800, height=600)
📍 移动位置 move()
仅修改窗口在屏幕上的位置。
代码块:
# 将窗口移动到指定坐标
win.move(x, y)
参数详解:
- x (int): 目标 X 轴起始坐标。
- y (int): 目标 Y 轴起始坐标。
案例:
# 将窗口挪到屏幕左上角
win.move(0, 0)
📏 修改尺寸 resize()
仅修改窗口的大小。
代码块:
# 调整窗口的宽度和高度
win.resize(width, height)
参数详解:
- width (int): 目标窗口宽度。
- height (int): 目标窗口高度。
案例:
# 将窗口调整为 1024x768
win.resize(1024, 768)
3.2 交互与截图
📸 窗口截图 capture()
获取窗口画面。
代码块:
# 截取窗口内容
win.capture(save_path=None, format=WindowCaptureFormat.PIL, rect=None, force_activate=True)
参数详解:
- save_path (str): 图片保存路径。若为
None则不保存。 - format: 输出格式。支持:
WindowCaptureFormat.PIL,.NUMPY,.OPENCV。 - rect (WindowRect): 局部区域坐标。若为
None则截取整窗。 - force_activate (bool): 截图前是否强制将窗口激活并置顶。
案例:
# 截图并保存为 PNG
win.capture(save_path="shot.png")
🖱️ 鼠标点击 click()
向窗口发送后台点击消息。
代码块:
# 模拟点击窗口内的某个位置
win.click(x, y, is_relative=True, button="left")
参数详解:
- x / y (int): 点击位置坐标。
- is_relative (bool): 是否使用相对坐标(窗口左上角为原点)。
- button (str): 使用的按键。支持
"left"(左键) 和"right"(右键)。
案例:
# 在窗口相对坐标 (50, 50) 点左键
win.click(50, 50)
🖱️ 鼠标长按 long_click()
模拟鼠标在指定位置的长按操作。
代码块:
# 在窗口内长按鼠标
win.long_click(x, y, duration=1.0, is_relative=True)
参数详解:
- x / y (int): 坐标位置。
- duration (float): 按下的持续时间(秒)。
- is_relative (bool): 是否使用相对坐标。
案例:
# 在坐标 (100, 100) 处长按 2 秒
win.long_click(100, 100, duration=2.0)
🚜 鼠标拖拽 drag()
模拟从起点到终点的平滑拖拽。
代码块:
# 模拟鼠标滑动手势
win.drag(x1, y1, x2, y2, duration=0.5, is_relative=True)
参数详解:
- x1, y1 (int): 起始坐标。
- x2, y2 (int): 终点坐标。
- duration (float): 拖拽滑动的总耗时(秒)。
- is_relative (bool): 是否使用相对坐标。
案例:
# 从 (10, 10) 拖拽到 (100, 100)
win.drag(10, 10, 100, 100)
⌨️ 文本输入 type_text()
向窗口发送文本字符串序列。
代码块:
# 后台模拟键盘输入
win.type_text(text)
参数详解:
- text (str): 需要输入的文本内容内容。
案例:
# 自动输入文字
win.type_text("Hello World")
3.3 状态管理
🔝 置顶设置 set_always_on_top()
设置或取消窗口的置顶状态。
代码块:
# 设置窗口是否永远在最前
win.set_always_on_top(toggle=True)
参数详解:
- toggle (bool): 为
True则置顶,False则取消。
🌟 激活窗口 activate()
将窗口切换至前台焦点。
代码块:
# 唤醒并激活窗口
win.activate()
- 说明: 无参数。若窗口最小化则会自动恢复。
📉 最小化 minimize()
将窗口最小化到任务栏。
代码块:
# 最小化窗口
win.minimize()
- 说明: 无参数。
🚪 关闭窗口 close()
以标准方式请求关闭窗口。
代码块:
# 关闭窗口
win.close()
- 说明: 无参数。发送
WM_CLOSE消息。
💀 终结进程 kill()
强行结束窗口所属的进程。
代码块:
# 强行结束程序
win.kill()
- 说明: 无参数。成功返回
True,失败返回False。
4. 窗口属性 (Properties)
这些属性可以通过 win.属性名 直接读取:
| 属性 | 返回类型 | 说明 |
|---|---|---|
win.title | str | 获取窗口当前的标题文字 |
win.class_name | str | 获取窗口系统类名 |
win.pid | int | 获取进程 ID |
win.process_name | str | 获取进程文件名 |
win.process_path | str | 获取程序完整路径 |
win.is_visible | bool | 判断窗口当前是否可见 |
win.is_minimized | bool | 判断窗口是否最小化 |
win.is_maximized | bool | 判断窗口是否最大化 |
win.is_responding | bool | 判断程序是否未卡死 |
win.is_always_on_top | bool | 判断窗口是否置顶 |
win.rect | WindowRect | 获取坐标尺寸对象 |
💡 终极实战案例
# 导入模块
from ascript.windows.window import Window
# 1. 查找或启动记事本
win = Window.find(process_name="notepad.exe") or Window.launch(path="notepad.exe")
if win:
# 2. 调整布局
win.set_rect(x=100, y=100, width=600, height=400)
win.activate()
# 3. 自动化操作
win.type_text("Hello, Windows Automation!")
win.capture(save_path="result.png")