win32api 是 pywin32 库的一部分,它是一个强大的 Python 扩展,提供了对 Windows API(应用程序编程接口)的全面访问,这意味着你可以在 Python 中直接调用那些通常只在 C/C++ 等底层语言中可用的 Windows 系统功能。

什么是 win32api?
win32api 是 Windows API 的 Python 封装,它将复杂的 C 语言风格函数和数据结构转换成了 Python 友好的对象和函数。
- 核心作用:让你能够编写 Python 脚本来直接与 Windows 操作系统进行交互,实现一些标准库无法完成的高级或底层操作。
- 所属套件:
win32api是pywin32套件的核心成员,安装pywin32时会自动包含它。 - 主要用途:
- 系统信息获取(如内存、CPU、磁盘)
- 窗口操作(查找、移动、激活、关闭窗口)
- 注册表读写
- 进程和线程管理
- 文件系统高级操作
- 与 COM 对象交互
- 调用 DLL 中的函数
安装
你需要安装 pywin32 库,打开你的命令行工具(如 CMD 或 PowerShell),然后运行:
pip install pywin32
安装完成后,你就可以在 Python 脚本中导入 win32api 了。
import win32api import win32con # 通常也会导入这个,它包含了大量的 Windows 常量定义
核心功能与示例代码
win32api 的功能非常庞大,下面是一些最常用和最核心的功能示例。

示例 1:获取系统信息
你可以轻松获取操作系统、计算机名、用户名等信息。
import win32api
import win32con
# 获取Windows版本信息
os_version = win32api.GetVersionEx()
print(f"操作系统版本信息: {os_version}")
print(f"操作系统名称: {os_version['szCSDVersion']}") # "Service Pack 1"
print(f"主版本号: {os_version['dwMajorVersion']}")
print(f"次版本号: {os_version['dwMinorVersion']}")
# 获取计算机名和用户名
computer_name = win32api.GetComputerName()
user_name = win32api.GetUserName()
print(f"计算机名: {computer_name}")
print(f"当前用户: {user_name}")
# 获取系统内存信息
global_memory_status = win32api.GlobalMemoryStatusEx()
total_memory = global_memory_status['ullTotalPhys'] / (1024 ** 3) # 转换为 GB
available_memory = global_memory_status['ullAvailPhys'] / (1024 ** 3)
print(f"总物理内存: {total_memory:.2f} GB")
print(f"可用物理内存: {available_memory:.2f} GB")
示例 2:注册表操作
这是 win32api 的一个经典用途,可以读取和修改 Windows 的注册表。
警告: 不当的注册表操作可能导致系统不稳定,请务必小心!
import win32api
import win32con
# 定义注册表路径和键名
key_path = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
value_name = "MyTestApp"
try:
# 1. 打开注册表键
# HKEY_LOCAL_MACHINE 的键需要管理员权限
# 这里我们使用 HKEY_CURRENT_USER,所有用户都有权限
key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER, key_path, 0, win32con.KEY_READ)
# 2. 读取一个值
try:
value, value_type = win32api.RegQueryValueEx(key, value_name)
print(f"读取到注册表值 '{value_name}': {value} (类型: {value_type})")
except win32api.error as e:
print(f"注册表中不存在 '{value_name}': {e}")
# 3. 关闭键
win32api.RegCloseKey(key)
# --- 写入注册表示例 ---
# key_path_write = r"SOFTWARE\\MyCompany\\MyApp"
# subkey = win32api.RegCreateKeyEx(win32con.HKEY_CURRENT_USER, key_path_write, 0, None, win32con.REG_OPTION_NON_VOLATILE, win32con.KEY_ALL_ACCESS, None)
# win32api.RegSetValueEx(subkey, "InstallPath", 0, win32con.REG_SZ, r"C:\Program Files\MyApp")
# win32api.RegSetValueEx(subkey, "Version", 0, win32con.REG_DWORD, 1001)
# win32api.RegCloseKey(subkey)
# print("注册表写入成功")
except win32api.error as e:
print(f"操作注册表时出错: {e}")
示例 3:窗口操作
你可以查找、激活、最小化、最大化甚至关闭其他应用程序的窗口。
import win32api
import win32con
import win32gui # 注意:窗口操作通常在 win32gui 模块中更方便
# 查找窗口
# FindWindow(窗口类名, 窗口标题)
# 记事本的窗口类名通常是 "Notepad"
notepad_hwnd = win32gui.FindWindow("Notepad", None)
if notepad_hwnd:
print(f"找到记事本窗口,句柄: {notepad_hwnd}")
# 激活窗口(将其置于前台)
win32gui.SetForegroundWindow(notepad_hwnd)
# 最小化窗口
win32gui.ShowWindow(notepad_hwnd, win32con.SW_MINIMIZE)
# 最大化窗口
# win32gui.ShowWindow(notepad_hwnd, win32con.SW_MAXIMIZE)
# 恢复窗口(从最小化/最大化状态)
# win32gui.ShowWindow(notepad_hwnd, win32con.SW_RESTORE)
# 关闭窗口 (发送 WM_CLOSE 消息)
# win32gui.PostMessage(notepad_hwnd, win32con.WM_CLOSE, 0, 0)
else:
print("没有找到打开的记事本窗口,请先打开一个记事本。")
示例 4:调用 DLL 函数
win32api 的核心功能之一是动态链接库的调用。
import win32api
import win32con
# 获取系统当前时间的例子
# 使用 kernel32.dll 中的 GetLocalTime 函数
# 1. 加载 DLL
kernel32 = win32api.LoadLibrary("kernel32.dll")
# 2. 获取函数地址
# GetLocalTime 接受一个指向 SYSTEMTIME 结构的指针
get_local_time = win32api.GetProcAddress(kernel32, "GetLocalTime")
# 3. 准备一个缓冲区来接收数据
# SYSTEMTIME 结构包含年、月、日、时、分、秒等字段
# 我们创建一个足够大的缓冲区
buffer = win32api.GlobalAlloc(win32con.GMEM_FIXED | win32con.GMEM_ZEROINIT, 32)
# 4. 调用函数
win32api.CallProcedure(get_local_time, (buffer,))
# 5. 从缓冲区中解析数据
# SYSTEMTIME 结构的偏移量可以通过 ctypes 或手动计算
# 年 (WORD) - 偏移 0
# 月 (WORD) - 偏移 2
# 日 (WORD) - 偏移 4
# 时 (WORD) - 偏移 8
# 分 (WORD) - 偏移 10
# 秒 (WORD) - 偏移 12
year = win32api.LOWORD(win32api.PtrToUlong(win32api.GetMemoryAddress(buffer)))
month = win32api.HIWORD(win32api.PtrToUlong(win32api.GetMemoryAddress(buffer + 2)))
day = win32api.LOWORD(win32api.PtrToUlong(win32api.GetMemoryAddress(buffer + 4)))
hour = win32api.LOWORD(win32api.PtrToUlong(win32api.GetMemoryAddress(buffer + 8)))
minute = win32api.LOWORD(win32api.PtrToUlong(win32api.GetMemoryAddress(buffer + 10)))
second = win32api.LOWORD(win32api.PtrToUlong(win32api.GetMemoryAddress(buffer + 12)))
print(f"当前本地时间: {year}-{month:02d}-{day:02d} {hour:02d}:{minute:02d}:{second:02d}")
# 6. 释放资源
win32api.GlobalFree(buffer)
win32api.FreeLibrary(kernel32)
注意:直接调用 DLL 比较复杂,对于
GetLocalTime这种常用功能,通常有更简单的 Pythonic 方式,datetime模块,这个例子只是为了展示win32api的底层调用能力。
官方文档与学习资源
pywin32 的文档是学习 win32api 的最佳资源。
-
官方文档
- 链接: https://mhammond.github.io/pywin32/
- 这是
pywin32的官方文档,包含了所有模块(win32api,win32gui,win32com等)的详细说明、函数列表和示例,虽然不是所有函数都有详细的文档,但它是权威的参考。
-
文档阅读方法
- 在文档首页,你会看到 "Modules" 部分。
- 点击你感兴趣的模块,
win32,这会带你到win32包的页面。 - 在这个页面,你会看到
win32api等子模块的链接,点击win32api即可查看其内容。 - 文档通常列出了模块中可用的函数、类和常量,并附有简单的说明。
-
其他资源
- GitHub 仓库: https://github.com/mhammond/pywin32 可以在这里找到源代码和问题跟踪。
- Stack Overflow: 在遇到具体问题时,搜索 "python win32api" 或 "pywin32" 是非常有效的解决途径,很多前人已经遇到并解决了各种棘手的问题。
重要注意事项
- 平台限制:
win32api仅适用于 Windows 操作系统,在 macOS 或 Linux 上导入它会直接失败。 - 权限问题: 某些操作(如修改
HKEY_LOCAL_MACHINE下的注册表项、写入系统目录等)需要管理员权限,如果你的脚本执行这些操作时遇到权限错误,请尝试以管理员身份运行 Python 脚本。 - 复杂性: Windows API 非常庞大且复杂,很多概念(如句柄
HANDLE、窗口句柄HWND、消息泵Message Pump)对于不熟悉 Windows 编程的开发者来说可能比较晦涩,需要耐心学习和实践。 - 替代方案: 对于很多任务,Python 标准库或第三方库提供了更简单、更 Pythonic 的方式。
- 注册表: 可以考虑使用
winreg模块(Python 3 标准库),它是win32api中注册表功能的简化版。 - 系统信息:
psutil库提供了跨平台的、更易用的系统监控功能。 - GUI 自动化: 对于窗口操作,
pywinauto或pyautogui库通常比直接使用win32gui更容易上手。
- 注册表: 可以考虑使用
win32api 是 Python 开发者在 Windows 平台上进行底层系统编程的利器,它功能强大,但学习曲线也相对陡峭,当你需要实现标准库无法满足的、与 Windows 系统深度交互的功能时,win32api 是你的不二之选。
建议学习路径:
- 从官方文档开始,了解有哪些功能可用。
- 从简单的示例(如获取系统信息、读写注册表)入手。
- 逐步挑战更复杂的任务(如窗口操作、进程管理)。
- 善用搜索引擎和 Stack Overflow 解决具体问题。
