Python鼠标单击小程序

  • 前言
  • 设计思路
  • 窗口界面参数获取
  • 浏览器窗口查找和定位
  • 鼠标模拟
  • 窗口界面关闭
  • 结果


前言

果真,GF和deadline真是生产力。需求呢,公司内部网页学习平台,视频播放每10分钟需要鼠标点击一次,影响学习体验(或者说影响挂机刷分)。于是,就用python边学边写了个鼠标定时点击小程序,基本实现所有功能,算是交差,窗口如下。

python源码不寻求依赖安装 python不依赖鼠标的点击_控件

设计思路

主要涉及到python的win32操作,图形界面开发。主逻辑:(1)显示窗口界面,获取用户输入参数,设置成功(2)点击主程序,找到浏览器目标窗口,最大化,点击目标位置,最小化,(3)关闭窗口,信息提示,关闭窗口和点击主程序。

窗口界面参数获取

python窗口界面开发方面,查找资料,主要关注wxPython和自带的tkinter。貌似在代码量方面,wxPython较tkinter更有优势[1],但是考虑到自身的学习成本,以及手头刚好有tkinter教程,就在此使用了tkinter做界面开发。

界面方面:主要涉及tkinter的Radiobutton(单选)控件,Label(标签)控件,Entry(输入框)控件,Button(按钮)控件以及Text(文本)控件,界面布局使用grid布局。

接收参数:主要从用户图形界面接收浏览器类型、需点击的浏览器页面标题、需点击位置的屏幕x和y轴像素点坐标、间隔点击时间,共5个参数。
对于图形界面中参数的接收,需要为对应的控件绑定变量,通过变量的get()方法获得对应的输入值。

浏览器窗口查找和定位

在这里对浏览器窗口进行定位,最大化和最小化。注意在浏览器类型方面,需要根据浏览器进行判断,需要获得窗口类型和浏览器实际的标题名称。可以借助工具Window Spy(窗体侦探软件) 获取信息。

import win32con
import win32api
import win32gui
import time
#窗体显示并最大化函数
def controlWin(classType,winName):
    browser=win32gui.FindWindow(classType,winName)
    if win32gui.ShowWindow(browser,win32con.SW_HIDE): #如果隐藏
        win32gui.ShowWindow(browser, win32con.SW_SHOW)
    time.sleep(1)
    win32gui.ShowWindow(browser, win32con.SW_MAXIMIZE)

#窗体最小化函数
def minWin(classType,winName):
    browser=win32gui.FindWindow(classType,winName)
    time.sleep(1)
    win32gui.ShowWindow(browser, win32con.SW_MINIMIZE)

#windowName 为"视频播放 - XX学堂"
def getWindowname(browserType,windowName="视频播放 - XX学堂"):
    if browserType=="火狐浏览器":
        classType="MozillaWindowClass"
        windowName=windowName+" - Mozilla Firefox"
    elif browserType=="谷歌浏览器":
        classType="Chrome_WidgetWin_1"
        windowName=windowName+" - Google Chrome"
    else:
        browserType=="QQ浏览器"
        classType="QQBrowser_WidgetWin_1"
        windowName=windowName
    return (classType,windowName)

鼠标模拟

鼠标点击操作,如果用户不设置在此使用屏幕分辨率宽和高的一半作为x和y的默认值。间隔时间设置为分钟。

# 间隔单击鼠标 主控制函数
def oneClick(x,y,t,classType,winName):
    t=t*60
    while True:
        #找到窗口最大化
        controlWin(classType,winName)
        # 设置鼠标的位置
        win32api.SetCursorPos([x, y])  # x,y轴坐标
        # 控制鼠标左键
        # 左键单击
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0)  # 按下
        time.sleep(0.1)
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0)  # 抬起
        #最小化窗体
        minWin(classType, winName)
        time.sleep(t)

对于屏幕分辨率的获取,可以使用win32api中的GetSystemMetrics()方法,也可以使用ctypes库中的 ctypes.windll.GetSystemMetrics()方法,参考文献[5]。

窗口界面关闭

由于鼠标点击的主函数是个死循环,点击设置按钮后启动,图形界面除了最小化、关闭选框能操作,无法再次设置。因而主窗体和点击进程同时存在,需要在主线程中再开启线程,执行鼠标点击程序。因此,在关闭界面窗口时需要杀死开启的线程,对于进程的关闭一般使用join()方法,但是join()方法是在进程执行结束后在关闭进程,而我们的点击进程死循环永远执行不完,join()方法无效。在此查询借鉴使用ctypes库从底层杀死线程,参考文献[2]。点击窗口退出的程序参考文献[3]。

结果

结果最终实现了所需功能,但是多次点击设置,会开启多个不同的点击线程,此时后面还需考虑把前面的线程杀死只保留当前设置的。最后使用pyinstaller实现自定义ICON和exe程序打包,最终8.67MB。ICON可以使用PS自己设计,利用ICOFormat64.8bi插件保存为.ico文件。在搜索如何获取鼠标点击坐标是,看到了参考文献[4],白辛苦一场(掩面痛哭),已经有小伙伴实现了。在此总体代码就不再放出了,有类似需求,大家主要参考使用文献[4]吧。

参考文献
[1] 同一图形界面:tkinter和wxPython代码对比, https://blog.csdn.net/wjciayf/article/details/50697184?ops_request_misc=&request_id=&biz_id=102&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0
[2] 在python中实现强制关闭线程的示例, https://www.jb51.net/article/155165.htm
[3] tkinter 点击退出执行的程序,
[4] python实现获取屏幕坐标位置值+VBS模拟鼠标操作,https://www.52pojie.cn/thread-974430-1-1.html
[5] 如何在Python中获得显示器分辨率?http://www.imooc.com/wenda/detail/576561