在日常工作中,我们经常需要重复一些机械性的鼠标操作,比如从特定软件中导出数据。这类工作耗时且容易出错,而Python可以通过模拟鼠标点击来实现自动化,帮我们节省大量时间。本文就以同花顺软件自动导出股票数据为例,介绍如何用Python实现鼠标自动点击操作。
核心原理
Python模拟鼠标点击主要依赖两个关键库:
pygetwindow:用于查找和管理窗口pywin32:提供Windows系统级API,实现窗口操作和鼠标模拟
通过这两个库,我们可以实现查找目标窗口、激活窗口、移动鼠标、模拟点击等一系列操作,从而完成自动化流程。
环境准备
首先需要安装必要的依赖库:
pip install pygetwindow pywin32
实现步骤
1. 窗口操作基础
要操作一个软件,首先需要找到并激活它的窗口:
import pygetwindow as gw
import win32gui
import win32con
def activate_window(keyword):
# 查找标题包含关键字的窗口
windows = gw.getWindowsWithTitle(keyword)
if not windows:
raise Exception(f"未找到标题包含'{keyword}'的窗口")
# 选择第一个窗口并激活
target_window = windows[0]
hwnd = target_window._hWnd # 获取窗口句柄
# 如果窗口最小化,恢复它
if win32gui.IsIconic(hwnd):
win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)
# 激活窗口到前台
win32gui.BringWindowToTop(hwnd)
win32gui.SetForegroundWindow(hwnd)
# 返回窗口坐标信息
left, top, right, bottom = win32gui.GetWindowRect(hwnd)
return {
"left": left,
"top": top,
"right": right,
"bottom": bottom,
"width": right - left,
"height": bottom - top
}
2. 鼠标操作封装
接下来实现鼠标移动和点击的功能:
import win32api
import win32con
import time
def move_mouse(x, y):
"""移动鼠标到指定坐标"""
win32api.SetCursorPos((int(x), int(y)))
def click_left():
"""模拟左键点击"""
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
time.sleep(0.05) # 模拟点击间隔
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
def click_right():
"""模拟右键点击"""
win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)
time.sleep(0.05)
win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0)
def move_and_click(x, y, button="left", wait_after=1.0):
"""移动到指定位置并点击,点击后等待指定时间"""
move_mouse(x, y)
if button == "left":
click_left()
else:
click_right()
time.sleep(wait_after)
3. 实现业务流程
有了基础操作后,我们可以根据具体业务流程组合这些操作。以同花顺导出数据为例:
def export_ths_data():
# 1. 激活同花顺窗口
coords = activate_window("同花顺(9")
a, b = coords["left"], coords["top"] # 窗口左上角坐标
# 2. 执行点击序列(根据实际界面调整坐标)
# 点击菜单
move_and_click(a + 61, b + 16, "left")
# 选择导出选项
move_and_click(a + 109, b + 231, "left")
# 其他必要点击...
move_and_click(a + 308, b + 235, "left")
# 3. 处理弹出对话框
# 查找对话框
dialog_hwnd = find_window_by_title("导入导出对话框模板")
# 查找并点击"下一页"按钮
next_btn = find_child_button(dialog_hwnd, "下一页(&N) >")
click_button(next_btn)
# 4. 等待完成并点击"完成"按钮
finish_btn = find_child_button(dialog_hwnd, "完成")
wait_until_button_enabled(finish_btn)
click_button(finish_btn)
print("数据导出完成")
关键技巧
- 坐标获取:可以通过截图工具获取按钮相对于窗口左上角的坐标,确保点击准确
- 添加等待:在操作之间添加适当的等待时间(
time.sleep()),应对软件响应延迟 - 错误处理:添加窗口未找到、按钮不可用等异常处理,提高脚本稳定性
- 窗口状态判断:通过
IsWindowVisible和IsIconic判断窗口状态,确保操作有效
注意事项
- 不同软件版本的界面可能不同,需要根据实际情况调整坐标
- 运行脚本时,尽量避免手动操作鼠标,以免干扰自动化流程
- 部分软件可能有反自动化机制,使用前需确认合规性
- 高分辨率屏幕可能需要调整坐标计算方式
通过这种方法,我们不仅可以实现同花顺数据导出的自动化,还可以应用到其他需要重复鼠标操作的场景,如表单填写、报表生成等,极大提高工作效率。
如果你需要针对特定软件编写自动化脚本,只需分析清楚操作步骤,然后用类似的方法组合窗口操作和鼠标点击即可。
4143

被折叠的 条评论
为什么被折叠?



