Bootstrap

python 实现模拟鼠标点击器 可运行 附源码

工具下载链接(网盘)

https://pan.baidu.com/s/1GIZPHQnRQqTD5h1Cy70MNQ?pwd=kxzz

一、前言:

  1. 对于一些比较肝的游戏,想要使用工具挂机;
  2. 对于一些购物时的抢购,使用工具来帮自己点击抢购,解放双手;
  3. 甚至当我们使用电脑时,有些情况下会强制跳出一些窗口,影响某些任务的进展,使用这个工具可以帮忙点击弹窗,关闭弹窗,使得任务继续,而不用人时刻盯在电脑旁点灭弹窗。

二、工具界面(超简单)

在这里插入图片描述

三、工具功能原理介绍

  1. 调用截图工具,截图保存想要模拟鼠标点击的地方的图片。比如想模拟鼠标点击一个弹窗的按钮,就可以把这个弹窗截图保存起来。
  2. 工具运行时,会依次将保存的截图与现在屏幕的画面进行匹配,一旦匹配上相似度大于90%的画面时,会控制鼠标移动到指定的位置(匹配到的截图的中心位置,截图时中心位置会标记出来,所以截图时就已经确定了之后模拟点击的位置),然后点击一次,再将鼠标移动到原来的位置。
  3. 使用者可以随时进行截图,工具运行时会一直重复匹配图像的过程

四、使用步骤

  1. 运行程序后会弹出询问窗口,简单介绍工具的使用方法,可以选择查看详细使用方法,也可以取消查看使用方法,直接使用工具。
  2. 之后会在屏幕右下方会跳出工具界面,点击自动点击开始截图,选好截图区域后,按空格或回车键保存截图并运行工具。
  3. 之后工具就根据截图匹配屏幕画面,内容相符时模拟鼠标点击(点击位置是截图区域的中心)

五、注意事项

  1. 对于打包成exe文件的小工具,使用时截图保存的图片不会自动删除,会保存在与exe文件同目录下。工具工作时会依次访问其同目录下的.png格式图片,用于匹配,所以第一次保存的截图如果不手动删除的话,第二次打开工具时会按照第一次的标准来识别,如果第二次想重新识别不同于第一次的内容,最好把第一次的截图删掉。(归根到底就是exe同目录下有哪些.png格式图片,工作时就会用那些.png图片匹配)。
  2. 对于没有打包的.py源代码文件,使用者在自己电脑上运行时,一定不要把源代码文件和本地其他.png图片放在同一目录下。一是可能会影响工具的使用效率,二是停止运行程序后,程序会自动递归清除同目录下所有文件中的.png图片(回收站里找不到那种)。

六、项目源码

import tkinter,cv2,PIL,numpy
from tkinter import messagebox
from PIL import ImageDraw,ImageGrab

import os
import datetime
import _thread
import pyautogui as p
import time
FLAG = True

#创建窗口   
def window():

    window=tkinter.Tk()
    window.protocol('WM_DELETE_WINDOW', delete_pictures)
    window.wm_attributes('-topmost',1)
    position_x=window.winfo_screenwidth()-150
    # window.geometry('%dx%d+%d+%d' % (100,30,(window.winfo_screenwidth()-100), (window.winfo_screenheight() - 100) ))
    window.geometry('%dx%d-%d-%d' % (120,30,0,50 ))
    window.resizable(width=False, height=False)

    button0=tkinter.Button(window, text="自动点击", command=button_command).pack()
    # window.focus_set()
    # button0.bind('<Button-2>', keyToButton) #按下s后,执行keyToButton函数,模拟点击按钮
    window.mainloop()

#点击按钮后,截屏,并全屏显示    
def button_command():
    mode=0
    mouse=False
    print ('start here')
   
    global img,img_copy
    #filename = 'temp.png'
    im = ImageGrab.grab()
    #im.save(filename)
    #im.close()
    #im=pyautogui.screenshot()
    imgSize=im.size
    #font = ImageFont.truetype('song.ttf', int((imgSize[0])*0.025))
    draw = PIL.ImageDraw.Draw(im)
    #draw.text((imgSize[0]*0.7, (imgSize[1]*0.92)), '拖拽鼠标截图,敲回车键继续', (255,0,0), font=font)
    
    img=numpy.array(im)
    img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    img_copy=img.copy()
    #img =  cv2.imread('1.png')
    cv2.namedWindow("ROI selector", cv2.WND_PROP_FULLSCREEN)
    cv2.setWindowProperty("ROI selector",cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)
    r = cv2.selectROI(img_copy)
    imCrop = img_copy[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])]
    #cv2.imshow('new',imCrop)
    cv2.destroyAllWindows()
    #cv2.setMouseCallback('window_full',self.mouse_action)
    print ('mid here')
    now1=str(datetime.datetime.now().strftime("%Y-%m-%d_%H%M%S"))
    cv2.imwrite(now1+'.png',imCrop)
"""
parameter:pic(png格式的图片)
function:根据传进来的图片,在屏幕上匹配该图片,匹配不到时函数结束,否则,模拟鼠标点击匹配图片的中心位置,点击后将鼠标返回到鼠标原来的位置,函数成功匹配执行后睡眠5秒。
"""
def find_pic(pic):
        x0,y0=p.position()  #记录当前鼠标位置;输出:Point(x=200, y=800)
        #position=p.locateCenterOnScreen(pic,confidence=0.9)
        # 使用函数:locateOnScreen(‘zan.png’) ,在当前屏幕中匹配zan.png,如果可以找到图片,则返回图片的位置,如:Box(left=25, top=703, width=22, height=22);如果找不到图片,则返回None;
        position = p.locateOnScreen(pic, confidence=0.9)  # confidence=0.9 表示匹配的置信度为0.9,可以理解是相似度。
        if position is None:
            return False
        else:
            #x,y=position
            x,y,w,h=position  # (x,y)为截图左上角坐标,w,h为截图的宽和高
            x=x+int(w/2)
            y=y+int(h/2)
            print(x,y)        # 计算截图中心的坐标,模拟点击的位置就是截图中心的坐标

            p.moveTo(x,y)     # 控制鼠标移动
            p.click()         # 模拟鼠标点击
            p.moveTo(x0,y0)   # 控制鼠标移动到一开始的位置
            time.sleep(5)
            return True
"""
parameter:无
function:找出同目录的所有png格式的图片,并依次作为参数调用find_pic函数,用于匹配
"""
def pic():
    global FLAG
    while True:
        for w in os.listdir('./'):
            if w.endswith('.png') & FLAG == True:
                find_pic(w)

"""
parameter:无
function:找出并删除同目录的所有png格式的图片,删除之后程序退出。
"""
def delete_pictures():  # 程序退出之后删除所有的png图片
    global FLAG
    FLAG = False
    print(os.path.dirname(__file__))
    path = os.path.dirname(__file__)

    for root, dirs, files in os.walk(path):
        for name in files:
            if name.endswith(".png"):  # 填写规则
                os.remove(os.path.join(root, name))
                print("Delete File: " + os.path.join(root, name))
    os._exit(0)

if __name__=='__main__':
    root = tkinter.Tk()
    root.withdraw()

    result = messagebox.askquestion('使用方法提醒', '功能实现简述:会先截图,当程序运行时屏幕中再次出现和截图类似的画面时,会在匹配目标的画面范围中心模拟点击,每隔5s点一次。\n例如,选择模拟点击的弹窗时,弹窗截图应尽量精确,且截图的中心位置就是模拟点击的位置。\n'
                                                '使用方法简述:阅完此消息,点确定按钮,会跳转到使用方法详细介绍,点取消按钮,屏幕右下方会跳出一小窗口,点击自动点击开始截图,之后按空格或回车键即可\n\n是否打开详细使用方法链接?')
    if result == 'yes':
        os.system('"C:/Program Files/Internet Explorer/iexplore.exe" https://blog.csdn.net/quxuexi/article/details/124972889?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165348401616782388091960%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165348401616782388091960&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~times_rank-1-124972889-null-null.142^v10^control,157^v12^control&utm_term=python+%E5%AE%9E%E7%8E%B0%E6%A8%A1%E6%8B%9F%E9%BC%A0%E6%A0%87%E7%82%B9%E5%87%BB%E5%99%A8+%E5%8F%AF%E8%BF%90%E8%A1%8C+%E9%99%84%E6%BA%90%E7%A0%81&spm=1018.2226.3001.4187')
    # messagebox.showinfo(title='使用方法提醒', message='功能实现简述:会先截图,当程序运行时屏幕中再次出现和截图类似的画面时,会在匹配目标的画面范围中心模拟点击,每隔5s点一次。\n例如,选择模拟点击的弹窗时,弹窗截图应尽量精确,且截图的中心位置就是模拟点击的位置。\n'
    #                                             '使用方法简述:阅完此消息,点确定按钮,屏幕右下方会跳出一小窗口,点击自动点击开始截图,之后按空格或回车键即可\n详细使用方法见链接:')
    _thread.start_new_thread( window, ())
    pic()
    delete_pictures()  # 关闭软件后,自动清除之前使用时保存的截图
    os._exit()


七、项目依赖包

altgraph==0.17.2
certifi==2022.5.18.1
future==0.18.2
importlib-metadata==4.11.4
MouseInfo==0.1.3
numpy==1.21.6
opencv-python==4.5.5.64
pefile==2021.9.3
Pillow==9.1.1
PyAutoGUI==0.9.53
PyGetWindow==0.0.9
pyHook @ file:///D:/%E6%A1%8C%E9%9D%A2/pyHook-1.5.1-cp37-cp37m-win_amd64.whl
PyMsgBox==1.0.9
pyperclip==1.8.2
PyRect==0.2.0
PyScreeze==0.1.28
pytweening==1.0.4
pywin32-ctypes==0.2.0
typing_extensions==4.2.0
wincertstore==0.2
zipp==3.8.0
;