python使用win32gui操作窗口

激活指定窗口

import win32gui
import win32con


def match_windows(win_title):
    """
    查找指定窗口
    :param win_title: 窗口名称
    :return: 句柄列表
    """

    def callback(hwnd, hwnds):
        if win32gui.IsWindowVisible(hwnd) and win32gui.IsWindowEnabled(hwnd):
            win_text = win32gui.GetWindowText(hwnd)
            # 模糊匹配
            if win_text.find(win_title) > -1:
                hwnds.append(hwnd)
        return True

    hwnds = []
    win32gui.EnumWindows(callback, hwnds)  # 列出所有顶级窗口,并传递它们的指针给callback函数
    return hwnds


def win_active(win_title):
    """
    激活指定窗口
    :param win_title: 窗口名称
    :return:
    """
    assert win_title, "win_title不能为空!"
    hwnds = match_windows(win_title)
    if hwnds:
        win32gui.ShowWindow(hwnds[0], win32con.SW_SHOWNORMAL)  # SW_SHOWNORMAL 默认大小,SW_SHOWMAXIMIZED 最大化显示
        win32gui.SetForegroundWindow(hwnds[0])
        win32gui.SetActiveWindow(hwnds[0])

最大化当前窗口

import win32gui
import win32con

hwnd = win32gui.GetForegroundWindow()
# 将当前窗口缩放至指定位置及大小
# win32gui.MoveWindow(hwnd, 0, 0, 1440, 900, True)
win32gui.ShowWindow(hwnd, win32con.SW_MAXIMIZE)
<think>我们被要求使用Pythonwin32gui库来关闭指定窗口。根据提供的引用,我们已经有了如何查找窗口和激活窗口的代码。关闭窗口通常可以使用`win32gui.PostMessage`函数发送关闭消息(`WM_CLOSE`)来实现。步骤:1.查找指定窗口的句柄(hwnd)。我们可以使用示例中提供的`match_windows`函数(稍作调整)来根据窗口标题查找窗口。2.向该窗口句柄发送`WM_CLOSE`消息。注意:`WM_CLOSE`消息会触发窗口的关闭过程,这相当于用户点击了窗口的关闭按钮,窗口会收到关闭消息并可能提示保存等。注意:如果窗口有未保存的数据,可能会弹出提示框,这取决于目标应用程序的行为。我们也可以考虑使用`win32gui.DestroyWindow`,但注意`DestroyWindow`是强制销毁窗口,可能会绕过应用程序的正常关闭流程(比如不保存数据),而且它主要用于销毁由调用线程创建的窗口。因此,通常推荐使用`PostMessage`发送`WM_CLOSE`。因此,我们可以编写一个函数`close_window(win_title)`,它首先查找匹配的窗口,然后向每个匹配的窗口发送`WM_CLOSE`消息(或者只关闭第一个,或者全部关闭,根据需求)。但是,用户可能希望关闭所有匹配的窗口,或者只关闭第一个。这里我们可以设计为关闭所有匹配的窗口。代码步骤:a.使用`match_windows`函数获取所有匹配的窗口句柄。b.遍历这些句柄,对每个句柄发送`WM_CLOSE`消息。注意:`WM_CLOSE`消息的常量是`win32con.WM_CLOSE`。另外,在引用[1]中,我们看到了激活窗口的代码,其中使用了`win32gui.ShowWindow`和`win32gui.SetForegroundWindow`等。关闭窗口不需要激活,但确保窗口处于可接收消息的状态是有必要的。不过,即使窗口最小化,它也能收到消息。所以,我们编写如下代码:首先,导入必要的模块:`win32gui`和`win32con`。然后,定义`match_windows`函数(从引用[1]中复制并稍作调整,因为原代码中使用了`win_text.find(win_title)>-1`,这是模糊匹配,我们保留)。接着,定义`close_window`函数,它接收一个窗口标题(可以部分匹配),然后关闭所有匹配的窗口。代码示例:</think>### 使用 Python win32gui 关闭指定窗口的方法 要使用 Python 的 `win32gui` 库关闭指定窗口,可以通过以下两种核心方法实现: #### 方法 1:发送 WM_CLOSE 消息(推荐) ```python import win32gui import win32con def close_window_by_title(window_title): """通过窗口标题关闭窗口(发送关闭消息)""" def callback(hwnd, hwnds): if win32gui.IsWindowVisible(hwnd) and win32gui.GetWindowText(hwnd) == window_title: hwnds.append(hwnd) hwnds = [] win32gui.EnumWindows(callback, hwnds) if hwnds: # 发送 WM_CLOSE 消息(相当于点击窗口关闭按钮) win32gui.PostMessage(hwnds[0], win32con.WM_CLOSE, 0, 0) return True return False # 使用示例 close_window_by_title("记事本") # 关闭标题为"记事本"的窗口 ``` **原理**: 通过 `PostMessage` 发送 `WM_CLOSE` 消息(值 `0x0010`),这会触发目标窗口的标准关闭流程,相当于用户点击了窗口右上角的关闭按钮。目标窗口会收到关闭事件并执行自身定义的关闭逻辑(如保存提示)[^1]。 #### 方法 2:强制销毁窗口 ```python import win32gui def force_close_window_by_title(window_title): """强制销毁指定标题的窗口""" hwnd = win32gui.FindWindow(None, window_title) if hwnd: # 直接销毁窗口(强制终止) win32gui.DestroyWindow(hwnd) return True return False # 使用示例 force_close_window_by_title("计算器") # 强制关闭计算器窗口 ``` **注意**: `DestroyWindow` 会立即终止窗口而不触发关闭事件,可能导致数据丢失。仅建议在程序无响应时使用[^2]。 --- ### 关键函数说明 1. **`EnumWindows`** 遍历所有顶层窗口,配合回调函数过滤目标窗口 ```python win32gui.EnumWindows(callback, hwnds) ``` 2. **`PostMessage`** 向窗口发送消息(非阻塞) ```python win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0) ``` 3. **`DestroyWindow`** 强制销毁窗口及其子窗口 ```python win32gui.DestroyWindow(hwnd) ``` --- ### 注意事项 1. 窗口标题需**完全匹配**(区分大小写),使用 `GetWindowText` 验证 2. 部分程序(如资源管理器)是多窗口架构,需用 `EnumChildWindows` 查找子窗口 3. 系统关键窗口(如桌面)可能无法关闭 4. 推荐优先使用 `WM_CLOSE` 方式,更符合 Windows 安全规范
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值