`pyautogui` 是一个跨平台的 Python 库,用于模拟鼠标移动、点击、键盘输入和屏幕截图等操作

发布时间:2026/7/15 23:55:50
`pyautogui` 是一个跨平台的 Python 库,用于模拟鼠标移动、点击、键盘输入和屏幕截图等操作 pyautogui是一个跨平台的 Python 库用于模拟鼠标移动、点击、键盘输入和屏幕截图等操作常用于 Windows也支持 macOS 和 Linux桌面自动化任务如自动填写表单、批量操作 GUI 软件、UI 测试、RPA机器人流程自动化等。⚠️ 注意事项需要管理员权限或关闭 UAC用户账户控制才能在某些受保护窗口如系统设置、UAC 弹窗中操作屏幕分辨率、多显示器、缩放比例如 Windows 显示设置中 125% 缩放会影响坐标定位建议使用pyautogui.FAILSAFE True默认开启移动鼠标到左上角可中断并配合pyautogui.size()和pyautogui.position()进行调试图像识别pyautogui.locateOnScreen()依赖截图匹配需确保目标图像清晰、无动态变化如时间戳、闪烁图标推荐使用.png格式并启用confidence参数需安装opencv-python键盘操作需注意焦点窗口——pyautogui不自动激活窗口建议先用pyautogui.getWindowsWithTitle()win.activate()需配合pygetwindow库聚焦目标窗口。✅ 基础示例Windows 下打开记事本并输入文字importpyautoguiimporttime# 确保安全机制开启pyautogui.FAILSAFETrue# 打开开始菜单并搜索记事本pyautogui.press(win)time.sleep(1)pyautogui.write(notepad,interval0.1)pyautogui.press(enter)time.sleep(2)# 等待记事本启动# 输入文本pyautogui.write(Hello from PyAutoGUI!,interval0.05)pyautogui.press(enter)pyautogui.write(自动化成功,interval0.05) 安装命令pipinstallpyautogui opencv-python# opencv 支持图像匹配 confidence 提示生产环境建议结合pygetwindow窗口管理、pynput更底层监听或uiautomationWindows 原生 UIA 支持更稳定可靠弥补pyautogui的局限性如高 DPI 适配、无图像时的控件定位等。在 Windows 中启用高 DPI 缩放如 125%、150%时pyautogui默认获取的是逻辑像素DPI 缩放后坐标但底层 Windows API 返回的是物理像素真实屏幕分辨率而pyautogui的鼠标移动/点击函数如moveTo()、click()默认按物理像素操作导致坐标严重偏移通常表现为点击位置偏左上角偏移比例 ≈ 1/缩放比。✅根本原因Windows 启用 DPI 感知DPI-awareness后不同进程的 DPI 缩放行为不同。Python 进程默认为DPI-unaware系统会对其 UI 进行“虚拟化缩放”但pyautogui调用的底层GetCursorPos/SetCursorPos等 API 返回/接受的是物理屏幕坐标而pyautogui.size()和pyautogui.position()在 DPI-unaware 进程中返回的是缩放后的逻辑坐标造成不一致。✅解决方案推荐顺序✅ 方案 1设置 Python 进程为 DPI-aware最彻底推荐在脚本最开头import 任何库前添加以下代码使 Python 进程声明为系统 DPI 感知从而让pyautogui获取/使用统一的物理坐标体系importctypestry:ctypes.windll.shcore.SetProcessDpiAwareness(1)# Windows 8.1except(AttributeError,OSError):try:ctypes.windll.user32.SetProcessDPIAware()# Windows Vista~8except(AttributeError,OSError):passimportpyautoguiprint(Screen size:,pyautogui.size())# 此时返回真实物理分辨率如 1920×1080print(Mouse position:,pyautogui.position())# 物理坐标与 click/move 一致✅ 效果pyautogui.size()和pyautogui.position()返回值与鼠标实际物理位置完全匹配所有moveTo()/click()坐标无需换算消除偏移。⚠️ 注意需管理员权限运行某些旧版系统罕见且部分老旧 GUI 库可能因 DPI 感知异常渲染但pyautogui本身无 UI不受影响。✅ 方案 2手动校正缩放比例兼容性更强适合无法设 DPI-aware 的场景若因环境限制如冻结为 exe 后失效、权限受限无法设置 DPI-aware可动态获取当前缩放比例并校正坐标importwinregimportpyautoguidefget_dpi_scale():try:keywinreg.OpenKey(winreg.HKEY_CURRENT_USER,rControl Panel\Desktop\WindowMetrics)# 获取 AppliedDPI 值单位1/96 inch即 96100%120125%144150%dpi,_winreg.QueryValueEx(key,AppliedDPI)winreg.CloseKey(key)returndpi/96.0except:return1.0# 默认 100%scaleget_dpi_scale()print(fDPI scale:{scale:.2f})# 使用示例将设计时记录的逻辑坐标 (x_log, y_log) 转为物理坐标x_log,y_log100,200x_physint(x_log*scale)y_physint(y_log*scale)pyautogui.click(x_phys,y_phys)⚠️ 局限需提前知道目标元素的「逻辑坐标」如截图标注位置且多显示器缩放不一致时需额外处理。✅ 方案 3禁用程序 DPI 缩放仅开发调试用右键 Python.exe → 属性 → 兼容性 → 更改高 DPI 设置 → 勾选 ✅ “替代高 DPI 缩放行为” → 选择“应用程序”→ 此时 Python 进程强制以 100% 缩放运行pyautogui坐标自然对齐但界面可能模糊。 补充建议使用pyautogui.screenshot()截图时确保截图区域与物理分辨率一致DPI-aware 后自动正确避免混合使用pyautogui.locateOnScreen()依赖截图和未校准坐标——务必保证截图和定位在同一 DPI 模式下可结合pygetwindow获取窗口物理位置win pygetwindow.getWindowsWithTitle(xxx)[0]; x, y win.left, win.top已为物理坐标。✅ 总结方法是否推荐适用场景SetProcessDpiAwareness(1)✅ 强烈推荐大多数现代 WindowsWin 8.1自动化脚本手动 DPI 校正⚠️ 备选兼容性要求极高或受限环境禁用 DPI 缩放❌ 仅调试不推荐用于生产