Pywin32

一 Pywin32相关介绍

Pywin32 是Python编程中针对 Windows 的扩展库,提供了对大部分 Win32 API 的访问、创建、和使用COM对象的能力以及Pythonwin环境。

Windows消息机制

Windows消息机制是指Windows系统和应用程序之间通过发送和接收消息来进行通信的一种方式。

Windows是一个 ==消息驱动== 的系统,应用程序想要实现某个功能需由消息来触发,对消息的响应和处理表示其要实现的功能。

Windows消息有 ==队列消息== 和 ==非队列消息== 之分,队列消息会先保存在消息队列中,等待应用程序从中取出并分发到各窗口处理;非队列消息会绕过消息队列直接发送到窗口过程被处理。

Windows窗口句柄

Windows的窗口句柄,是指在Windows系统中用来标识和操作窗口的一个值。窗口句柄的类型是 HWND ,它是一个32位无符号整数,全系统唯一。窗口句柄是一个指向系统内部数据结构的引用,这个数据结构包含了窗口的属性和状态,如位置、大小、样式、文本、子窗口等。

Windows的窗口句柄有以下几个特点:

  • 窗口句柄是由系统分配和管理的,应用程序不能修改或创建窗口句柄。
  • 窗口句柄在窗口的生命周期内是固定不变的,但是在不同的进程或会话中,同一个窗口的句柄可能不同。
  • 窗口句柄可以通过一些函数来获取,如 FindWindow 、 GetWindow 、 GetDlgItem 等。
  • 窗口句柄可以通过一些函数来使用,如 SendMessage 、 SetWindowPos 、 ShowWindow 等。
  • 窗口句柄可以用来与其他框架或语言进行互操作,如 WinUI 、 WPF 、 WinForms 、 Python 等。

二 Pywin32的使用

安装 pywin32

在当前Python环境下安装 pywin32 的命令如下:

bash
pip install Pywin32 -i https://pypi.tuna.tsinghua.edu.cn/simple
  • win32api :模块内定义了常用的一些 API函数,例如:MessageBox
  • win32gui :模块内定义了一些有关 图形操作的API,例如:FindWindow
  • win32con :模块内定义了 windows API 内的宏,即 宏常量。

下面将介绍几个常用API的使用:

FindWindow

win32gui.FindWindow用于检索顶级窗口的句柄,其类名和窗口名与指定的字符串匹配。这个函数不搜索子窗口,也不区分大小写。要搜索子窗口,可以使用win32gui.FindWindowEx函数。

win32gui.FindWindow可以用来获取指定窗口的句柄,然后对其进行一些操作,如移动、调整、激活、发送消息等。 也可以用来过滤出符合一定条件的窗口,如类名、标题、控件ID等。

GetDesktopWindow

win32gui.GetDesktopWindow() 是一个 Python 函数,用来调用 Windows API 中的 GetDesktopWindow 函数,检索桌面窗口的句柄。桌面窗口覆盖整个屏幕,是绘制其他窗口顶部的区域。桌面窗口的句柄可以用来进行一些操作,如截屏、设置壁纸、查找子窗口等。

EnumChildWindows

win32gui.EnumChildWindows() 用来调用 Windows API 中的 EnumChildWindows 函数,枚举属于指定父窗口的子窗口。子窗口是指在父窗口的工作区内创建的窗口,它们与父窗口共享相同的消息队列和输入状态。

GetWindowText

win32gui.GetWindowText() 用来调用 Windows API 中的 GetWindowTextW 函数,获取指定窗口句柄的标题栏文本。

win32gui.GetWindowText(hwnd) 可以用来获取窗口或控件的标题、标签、内容等信息,然后对它们进行一些操作,如显示、比较、修改等。 也可以用来过滤出符合一定条件的窗口或控件,如类名、标题、控件ID等。

GetWindowRect

win32gui.GetWindowRect(hWnd) 用来调用 Windows API 中的 GetWindowRect 函数,检索指定窗口的边界矩形的尺寸。尺寸以相对于屏幕左上角的屏幕坐标提供。

win32gui.GetWindowRect(hWnd) 可以用来获取窗口的位置、大小、形状等信息,然后对它们进行一些操作,如移动、调整、截图等。 也可以用来过滤出符合一定条件的窗口,如在某个区域内、超出屏幕范围等。

GetWindowDC

win32gui.GetWindowDC()获取了窗口设备上下文句柄

设备上下文(Device Context)是一个用于绘图的数据结构,它封装了与显示设备相关的信息。

win32gui.GetWindowDC适用于窗口的非客户区域中的特殊绘图效果。非客户区域是指窗口中不包括工作区的部分,如标题栏、菜单和滚动条。绘图完成后,必须调用win32gui.ReleaseDC函数才能释放设备上下文。

CreateDCFromHandle

win32ui.CreateDCFromHandle将窗口设备上下文句柄转换为设备上下文对象。

win32ui.CreateDCFromHandle的用途有以下几点:

  • 可以用来创建一个内存设备上下文,用于在内存中绘制位图,然后将其复制到屏幕或打印机上。
  • 可以用来创建一个打印机设备上下文,用于在打印机上绘制图形或文本。
  • 可以用来创建一个显示设备上下文,用于在屏幕上绘制窗口或控件。

CreateBitmap

win32ui.CreateBitmap()可以创建一个位图对象,该对象表示一个未分配内存的位图。

三 Pywin32应用总结

获取窗口句柄

获取指定窗口标题应用的窗口句柄:

python
import win32gui

hwnd = win32gui.FindWindow(None, "地下城与勇士:创新世纪")
print("窗口句柄:", hwnd)

获取桌面窗口的句柄:

python
import win32gui

hdesktop = win32gui.GetDesktopWindow()
print("桌面窗口句柄:", hdesktop)

根据某个窗口句柄、获取其全部子窗口的句柄(下面以获取桌面窗口的子窗口句柄为例):

python
import win32gui

hdesktop = win32gui.GetDesktopWindow()
print("桌面窗口句柄:", hdesktop)

# 获取桌面窗口的所有子窗口句柄
hwndChildList = []
win32gui.EnumChildWindows(hd, lambda hwnd, param: param.append(hwnd), hwndChildList)
for hwnd in hwndChildList:
    text = win32gui.GetWindowText(hwnd)
    print(hwnd, text)