import time
import threading
from pynput.mouse import Controller, Button
class AutoClicker:
def __init__(self):
self.mouse = Controller()
self.running = False
self.clicking = False
self.delay = 0.1
self.click_type = 'left'
self.click_count = 0
self.max_clicks = 0
self.click_thread = None
self.position = None
def set_delay(self, delay):
"""设置点击间隔(秒)"""
self.delay = max(0.01, delay)
def set_click_type(self, click_type):
"""设置点击类型:left(左键)、right(右键)、middle(中键)"""
if click_type in ['left', 'right', 'middle']:
self.click_type = click_type
def set_position(self, x=None, y=None):
"""设置点击位置,None表示跟随鼠标当前位置"""
if x is not None and y is not None:
self.position = (x, y)
else:
self.position = None
def set_max_clicks(self, count):
"""设置最大点击次数,0表示无限"""
self.max_clicks = max(0, count)
def start_clicking(self):
"""开始点击"""
if not self.running:
self.running = True
self.clicking = True
self.click_count = 0
self.click_thread = threading.Thread(target=self._clicking_loop)
self.click_thread.daemon = True
self.click_thread.start()
def pause_clicking(self):
"""暂停点击"""
self.clicking = False
def stop_clicking(self):
"""停止点击"""
self.running = False
self.clicking = False
if self.click_thread:
self.click_thread.join(timeout=0.5)
def _clicking_loop(self):
"""点击循环"""
button_map = {
'left': Button.left,
'right': Button.right,
'middle': Button.middle
}
button = button_map[self.click_type]
while self.running:
if self.clicking:
if self.position:
self.mouse.position = self.position
self.mouse.click(button)
self.click_count += 1
if self.max_clicks > 0 and self.click_count >= self.max_clicks:
self.pause_clicking()
time.sleep(self.delay)
def main():
"""演示使用示例"""
print("自动连点器已启动...")
print("按1: 开始连点")
print("按2: 暂停连点")
print("按3: 设置点击间隔(秒)")
print("按4: 设置点击类型(left/right/middle)")
print("按5: 设置固定点击位置")
print("按6: 设置最大点击次数(0表示无限)")
print("按q: 退出程序")
clicker = AutoClicker()
try:
while True:
command = input("请输入命令: ").strip().lower()
if command == '1':
clicker.start_clicking()
print(f"开始连点,间隔{clicker.delay}秒,点击类型:{clicker.click_type}")
if clicker.max_clicks > 0:
print(f"最大点击次数: {clicker.max_clicks}")
else:
print("无限点击,按2暂停")
elif command == '2':
clicker.pause_clicking()
print(f"已暂停,总点击次数: {clicker.click_count}")
elif command == '3':
try:
delay = float(input("请输入点击间隔(秒,最小0.01秒): "))
clicker.set_delay(delay)
print(f"已设置点击间隔为{delay}秒")
except ValueError:
print("输入无效,请输入数字")
elif command == '4':
click_type = input("请输入点击类型(left/right/middle): ").strip().lower()
clicker.set_click_type(click_type)
print(f"已设置点击类型为{click_type}")
elif command == '5':
try:
x = int(input("请输入X坐标: "))
y = int(input("请输入Y坐标: "))
clicker.set_position(x, y)
print(f"已设置固定点击位置为({x}, {y})")
except ValueError:
print("输入无效,请输入整数坐标")
elif command == '6':
try:
count = int(input("请输入最大点击次数(0表示无限): "))
clicker.set_max_clicks(count)
print(f"已设置最大点击次数为{count}")
except ValueError:
print("输入无效,请输入整数")
elif command == 'q':
clicker.stop_clicking()
print(f"程序已退出,总点击次数: {clicker.click_count}")
break
else:
print("未知命令,请重新输入")
except KeyboardInterrupt:
clicker.stop_clicking()
print(f"\n程序已中断,总点击次数: {clicker.click_count}")
if __name__ == "__main__":
main()