gargeburt 发表于 2025-11-12 10:22

鼠标自动点击程序

本帖最后由 gargeburt 于 2025-11-24 13:50 编辑

有时参加活动要点连续点击按钮,为了减轻手指压力,开发了此款软件,界面是用PYQT5做,打包前要安装好Pyqt5,具体功能得用法看界面即可。

import datetime
import sys

from PyQt5.QtCore import pyqtSignal
from system_hotkey import SystemHotkey
from PyQt5.QtGui import QIcon
from pymouse import PyMouse# 调用Pymouse模块

import time# 调用时间模块(考略到网站点击延时)
from PyQt5.QtWidgets import QApplication, QMainWindow, QStatusBar

from resource.mainwindows import Ui_MainWindow
import threading


class WindowPane(QMainWindow, Ui_MainWindow):
    sig_keyhot = pyqtSignal(str)
    addstatusbar = pyqtSignal(str)

    def __init__(self, parent=None, *args, **kwargs):
      super().__init__()
      self.setupUi(self)
      # 2. 设置我们的自定义热键响应函数
      self.sig_keyhot.connect(self.MKey_pressEvent)
      # 3. 初始化两个热键
      self.hk_start, self.hk_stop, self.hk_coords = SystemHotkey(), SystemHotkey(), SystemHotkey()
      # 4. 绑定快捷键和对应的信号发送函数
      self.hk_start.register(('control', 'f7'), callback=lambda x: self.send_key_event("start"))
      self.hk_stop.register(('control', 'f8'), callback=lambda x: self.send_key_event("stop"))
      self.hk_coords.register(('control', 'f9'), callback=lambda x: self.send_key_event("coords"))

      self.thread_stop = threading.Event()
      if self.thread_stop.isSet():
            self.thread_stop.clear()
      self.thread_running = False
      self.stopButton = False
      self.beginTime = None
      self.addstatusbar.connect(self.showMessage)

    # 热键处理函数
    def MKey_pressEvent(self, i_str):
      if i_str == 'start':
            self.startClick()
      if i_str == 'stop':
            self.stopClick()
      if i_str == 'coords':
            self.getCoords()

    # 热键信号发送函数(将外部信号,转化成qt信号)
    def send_key_event(self, i_str):
      self.sig_keyhot.emit(i_str)

    def getCoords(self):
      m = PyMouse()
      self.spinBox.setValue(m.position())
      self.spinBox_2.setValue(m.position())

    def startClick(self):
      try:
            self.beginTime = datetime.datetime.now()
            if not self.thread_running:
                ts = threading.Thread(target=self.thread_start, args=(), daemon=True)
                ts.start()
                self.thread_running = True
      except Exception as e:
            print(e)

    def stopClick(self):
      self.stopButton = True

    def showMessage(self, text):
      self.statusbar.showMessage(text)

    def thread_start(self):
      try:
            m = PyMouse()
            startTime = time.clock()
            timeCheck = True
            clickNum = 0
            while not self.stopButton and timeCheck:
                # m.move(self.spinBox.value(), self.spinBox_2.value())# 鼠标移动坐标(x,y)
                m.click(self.spinBox.value(), self.spinBox_2.value())# 鼠标点击坐标(x,y)
                clickNum += 1
                if self.spinBox_4.value():
                  time.sleep(self.spinBox_4.value() / 1000)
                else:
                  time.sleep(0.05)
                if self.spinBox_3.value():
                  timeCheck = (startTime + self.spinBox_3.value()) > float(time.clock())
                self.addstatusbar.emit(
                  '运行时间' + str(
                        (datetime.datetime.now() - self.beginTime).seconds) + '秒' + '      点击' + str(clickNum) + '次')
            self.stopButton = False
            self.thread_running = False
      except Exception as e:
            print(e)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    MainWindow = WindowPane()
    MainWindow.show()
    desk = QApplication.desktop()
    rect = desk.availableGeometry()
    sys.exit(app.exec_())

在代码文件夹中新建Resource目录,并新建Pyqt界面代码文件mainwindows.py,代码如下
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'mainwindows.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
      MainWindow.setObjectName("MainWindow")
      MainWindow.resize(251, 153)
      self.centralwidget = QtWidgets.QWidget(MainWindow)
      self.centralwidget.setObjectName("centralwidget")
      self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
      self.verticalLayout.setObjectName("verticalLayout")
      self.widget = QtWidgets.QWidget(self.centralwidget)
      self.widget.setObjectName("widget")
      self.gridLayout = QtWidgets.QGridLayout(self.widget)
      self.gridLayout.setObjectName("gridLayout")
      self.label = QtWidgets.QLabel(self.widget)
      font = QtGui.QFont()
      font.setFamily("微软雅黑")
      font.setPointSize(10)
      self.label.setFont(font)
      self.label.setObjectName("label")
      self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
      self.spinBox = QtWidgets.QSpinBox(self.widget)
      self.spinBox.setMaximum(9999)
      self.spinBox.setObjectName("spinBox")
      self.gridLayout.addWidget(self.spinBox, 0, 1, 1, 1)
      self.pushButton = QtWidgets.QPushButton(self.widget)
      font = QtGui.QFont()
      font.setFamily("微软雅黑")
      font.setPointSize(10)
      self.pushButton.setFont(font)
      self.pushButton.setObjectName("pushButton")
      self.gridLayout.addWidget(self.pushButton, 0, 2, 1, 1)
      self.label_2 = QtWidgets.QLabel(self.widget)
      font = QtGui.QFont()
      font.setFamily("微软雅黑")
      font.setPointSize(10)
      self.label_2.setFont(font)
      self.label_2.setObjectName("label_2")
      self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
      self.spinBox_2 = QtWidgets.QSpinBox(self.widget)
      self.spinBox_2.setMaximum(9999)
      self.spinBox_2.setObjectName("spinBox_2")
      self.gridLayout.addWidget(self.spinBox_2, 1, 1, 1, 1)
      self.pushButton_2 = QtWidgets.QPushButton(self.widget)
      font = QtGui.QFont()
      font.setFamily("微软雅黑")
      font.setPointSize(10)
      self.pushButton_2.setFont(font)
      self.pushButton_2.setObjectName("pushButton_2")
      self.gridLayout.addWidget(self.pushButton_2, 1, 2, 1, 1)
      self.label_3 = QtWidgets.QLabel(self.widget)
      font = QtGui.QFont()
      font.setFamily("微软雅黑")
      font.setPointSize(10)
      self.label_3.setFont(font)
      self.label_3.setObjectName("label_3")
      self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
      self.spinBox_3 = QtWidgets.QSpinBox(self.widget)
      self.spinBox_3.setMaximum(9999999)
      self.spinBox_3.setObjectName("spinBox_3")
      self.gridLayout.addWidget(self.spinBox_3, 2, 1, 1, 1)
      self.label_4 = QtWidgets.QLabel(self.widget)
      font = QtGui.QFont()
      font.setFamily("微软雅黑")
      font.setPointSize(10)
      self.label_4.setFont(font)
      self.label_4.setObjectName("label_4")
      self.gridLayout.addWidget(self.label_4, 3, 0, 1, 1)
      self.spinBox_4 = QtWidgets.QSpinBox(self.widget)
      self.spinBox_4.setMaximum(99999)
      self.spinBox_4.setObjectName("spinBox_4")
      self.gridLayout.addWidget(self.spinBox_4, 3, 1, 1, 1)
      self.pushButton_3 = QtWidgets.QPushButton(self.widget)
      font = QtGui.QFont()
      font.setFamily("微软雅黑")
      font.setPointSize(10)
      self.pushButton_3.setFont(font)
      self.pushButton_3.setObjectName("pushButton_3")
      self.gridLayout.addWidget(self.pushButton_3, 2, 2, 1, 1)
      self.verticalLayout.addWidget(self.widget)
      MainWindow.setCentralWidget(self.centralwidget)
      self.menubar = QtWidgets.QMenuBar(MainWindow)
      self.menubar.setGeometry(QtCore.QRect(0, 0, 251, 18))
      self.menubar.setObjectName("menubar")
      MainWindow.setMenuBar(self.menubar)
      self.statusbar = QtWidgets.QStatusBar(MainWindow)
      self.statusbar.setObjectName("statusbar")
      MainWindow.setStatusBar(self.statusbar)

      self.retranslateUi(MainWindow)
      self.pushButton.clicked.connect(MainWindow.startClick)
      self.pushButton_2.clicked.connect(MainWindow.stopClick)
      self.pushButton_3.clicked.connect(MainWindow.getCoords)
      QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
      _translate = QtCore.QCoreApplication.translate
      MainWindow.setWindowTitle(_translate("MainWindow", "MouseAutoClick"))
      self.label.setText(_translate("MainWindow", "X坐标"))
      self.pushButton.setText(_translate("MainWindow", "开始(Ctrl+F7)"))
      self.label_2.setText(_translate("MainWindow", "Y坐标"))
      self.pushButton_2.setText(_translate("MainWindow", "停止(Ctrl+F8)"))
      self.label_3.setText(_translate("MainWindow", "持续点击时间(s)"))
      self.label_4.setText(_translate("MainWindow", "点击间隔(ms)"))
      self.pushButton_3.setText(_translate("MainWindow", "坐标获取(Ctrl+F9)"))


应网友要求,加入打包好的文件供各位下载
通过网盘分享的文件:MouseClick.rar
链接: https://pan.baidu.com/s/1hvb49n8p4jvvCUjpzacEYQ 提取码: 8hp7 复制这段内容后打开百度网盘手机App,操作更方便哦

cxyqsau 发表于 2025-11-13 09:18

感谢楼主分享,先收藏了

gargeburt 发表于 2025-11-24 13:55

it598 发表于 2025-11-24 13:44
谢谢分享!怎么打包成EXE文件,我不会,有打好包的吗?

可用pyinstaller或nukia打包,但打包前要把环境和库装好,我编辑主题加入打包好的Exe了,等审核通过就能下载了

CenY03 发表于 2025-11-12 17:11

谢谢楼主,正好需要

Mackenzie 发表于 2025-11-12 20:41

支持楼主

chuk 发表于 2025-11-13 07:49

我得试试, 最近在用鼠大侠, 正好用上.

chenyucai 发表于 2025-11-13 09:08

先收藏了,感谢楼主

hjj168 发表于 2025-11-13 09:59

好像不错,工作用鼠标固定点击比较多

smallben 发表于 2025-11-13 10:14

这个感觉不错呀,小工具先收藏了

当初遇你时 发表于 2025-11-13 10:16

最近正好需要这个

feng0945 发表于 2025-11-13 10:21

感谢楼主分享,先收藏了
页: [1] 2 3 4
查看完整版本: 鼠标自动点击程序