Python获取Windows窗口

1. 简介

在编写Python程序时,我们经常需要与操作系统进行交互,包括获取窗口信息、控制窗口行为等。本文将介绍如何使用Python获取Windows窗口的基本信息,以及如何控制窗口的一些行为。

2. 获取窗口句柄

在Windows操作系统中,每个窗口都有一个唯一的标识符,称为窗口句柄(Window Handle)。可以使用Python的ctypes库来获取窗口句柄。

首先,我们需要导入相关的模块:

import ctypes

然后,我们定义一个函数get_window_handle来获取当前活动窗口的句柄:

def get_window_handle():
    user32 = ctypes.windll.user32
    handle = user32.GetForegroundWindow()
    return handle

上述代码中,ctypes.windll.user32表示加载了user32.dll库,然后使用GetForegroundWindow函数获取当前活动窗口的句柄。

3. 获取窗口标题

获取窗口句柄之后,我们可以进一步获取窗口的标题。同样使用ctypes库,定义一个函数get_window_title来获取窗口的标题:

def get_window_title(handle):
    buffer = ctypes.create_unicode_buffer(255)
    user32 = ctypes.windll.user32
    user32.GetWindowTextW(handle, buffer, ctypes.sizeof(buffer))
    return buffer.value

在上述代码中,create_unicode_buffer用于创建一个缓冲区来存储窗口标题,GetWindowTextW函数用于获取窗口标题。

4. 获取窗口位置和大小

除了获取窗口标题之外,我们还可以获取窗口的位置和大小。同样使用ctypes库,定义一个函数get_window_rect来获取窗口的位置和大小:

def get_window_rect(handle):
    rect = ctypes.wintypes.RECT()
    user32 = ctypes.windll.user32
    user32.GetWindowRect(handle, ctypes.byref(rect))
    left, top, right, bottom = rect.left, rect.top, rect.right, rect.bottom
    return (left, top, right, bottom)

在上述代码中,wintypes.RECT表示一个矩形结构体,通过GetWindowRect函数获取窗口的位置和大小,并返回一个包含左上角坐标和右下角坐标的元组。

5. 控制窗口行为

除了获取窗口信息之外,我们还可以使用ctypes库控制窗口的一些行为,例如最大化、最小化、还原等。下面是一些示例代码:

def maximize_window(handle):
    user32 = ctypes.windll.user32
    user32.ShowWindow(handle, 3)  # SW_MAXIMIZE

def minimize_window(handle):
    user32 = ctypes.windll.user32
    user32.ShowWindow(handle, 6)  # SW_MINIMIZE

def restore_window(handle):
    user32 = ctypes.windll.user32
    user32.ShowWindow(handle, 9)  # SW_RESTORE

在上述代码中,ShowWindow函数用于控制窗口的显示方式,其中SW_MAXIMIZE表示最大化窗口,SW_MINIMIZE表示最小化窗口,SW_RESTORE表示还原窗口。

6. 示例

下面是一个完整的示例代码,展示了如何获取当前活动窗口的标题、位置和大小,并最大化窗口:

import ctypes

def get_window_handle():
    user32 = ctypes.windll.user32
    handle = user32.GetForegroundWindow()
    return handle

def get_window_title(handle):
    buffer = ctypes.create_unicode_buffer(255)
    user32 = ctypes.windll.user32
    user32.GetWindowTextW(handle, buffer, ctypes.sizeof(buffer))
    return buffer.value

def get_window_rect(handle):
    rect = ctypes.wintypes.RECT()
    user32 = ctypes.windll.user32
    user32.GetWindowRect(handle, ctypes.byref(rect))
    left, top, right, bottom = rect.left, rect.top, rect.right, rect.bottom
    return (left, top, right, bottom)

def maximize_window(handle):
    user32 = ctypes.windll.user32
    user32.ShowWindow(handle, 3)  # SW_MAXIMIZE

handle = get_window_handle()
title = get_window_title(handle)
position = get_window