工具下载链接(网盘)
https://pan.baidu.com/s/1GIZPHQnRQqTD5h1Cy70MNQ?pwd=kxzz 文章来源:https://www.toymoban.com/news/detail-501274.html
一、前言:
- 对于一些比较肝的游戏,想要使用工具挂机;
- 对于一些购物时的抢购,使用工具来帮自己点击抢购,解放双手;
- 甚至当我们使用电脑时,有些情况下会强制跳出一些窗口,影响某些任务的进展,使用这个工具可以帮忙点击弹窗,关闭弹窗,使得任务继续,而不用人时刻盯在电脑旁点灭弹窗。
二、工具界面(超简单)
文章来源地址https://www.toymoban.com/news/detail-501274.html
三、工具功能原理介绍
- 调用截图工具,截图保存想要模拟鼠标点击的地方的图片。比如想模拟鼠标点击一个弹窗的按钮,就可以把这个弹窗截图保存起来。
- 工具运行时,会依次将保存的截图与现在屏幕的画面进行匹配,一旦匹配上相似度大于90%的画面时,会控制鼠标移动到指定的位置(匹配到的截图的中心位置,截图时中心位置会标记出来,所以截图时就已经确定了之后模拟点击的位置),然后点击一次,再将鼠标移动到原来的位置。
- 使用者可以随时进行截图,工具运行时会一直重复匹配图像的过程
四、使用步骤
- 运行程序后会弹出询问窗口,简单介绍工具的使用方法,可以选择查看详细使用方法,也可以取消查看使用方法,直接使用工具。
- 之后会在屏幕右下方会跳出工具界面,点击自动点击开始截图,选好截图区域后,按空格或回车键保存截图并运行工具。
- 之后工具就根据截图匹配屏幕画面,内容相符时模拟鼠标点击(点击位置是截图区域的中心)
五、注意事项
- 对于打包成exe文件的小工具,使用时截图保存的图片不会自动删除,会保存在与exe文件同目录下。工具工作时会依次访问其同目录下的.png格式图片,用于匹配,所以第一次保存的截图如果不手动删除的话,第二次打开工具时会按照第一次的标准来识别,如果第二次想重新识别不同于第一次的内容,最好把第一次的截图删掉。(归根到底就是exe同目录下有哪些.png格式图片,工作时就会用那些.png图片匹配)。
- 对于没有打包的.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
到了这里,关于python 实现模拟鼠标点击器 可运行 附源码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!