编辑代码

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  # 默认点击间隔0.1秒
        self.click_type = 'left'  # 默认左键点击
        self.click_count = 0
        self.max_clicks = 0  # 0表示无限点击
        self.click_thread = None
        self.position = None  # 点击位置,None表示跟随鼠标当前位置

    def set_delay(self, delay):
        """设置点击间隔(秒)"""
        self.delay = max(0.01, delay)  # 最小间隔0.01秒

    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()