Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 19.08.2022
Сообщений: 6

Кликер

19.09.2022, 23:24. Показов 5575. Ответов 3

Студворк — интернет-сервис помощи студентам
Здравствуйте, можете пожалуйста, помочь в доработке или написании с нуля программы, если так будет легче? с++ или python.
Что должная делать программа. В общем, программа отлавливает сочетание клавиш Ctrl + G. Когда его отловила, то начинает отлавливать нажатие ЛКМ, когда было нажато ЛКМ, то программа начинает кликать. Если было снова нажато ЛКМ, то программа перестает кликать, если же снова было отловлено Ctrl + G, то программа перестает следить за ЛКМ, и мышкой можно спокойно пользоваться.А программа снова отлавливает только Ctrl + G.



Вот код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#Ниже кода есть объяснение
 
import win32api
import pyautogui
import time
import random
 
 
def if_click():
    global t1, pause
    pause = random.choice(delay)
    t1 = time.time()
 
 
def check_main_mask():
    global flag_mask, flag_click
    flag = win32api.GetKeyState(0x11 and 0x47)  # Виртуальный код CTRL и 'G' соответственно
 
    if flag < 0:
        flag_mask = abs(1 - flag_mask)
        if not flag_mask:
            flag_click = False
 
 
def check_click():
    global flag_click
    flag = win32api.GetKeyState(0x01)  # Виртуальный код ЛКМ
 
    if flag < 0:
        flag_click = abs(1 - flag_click)
        if flag_click:
            if_click()
 
 
flag_mask = False
flag_click = False
delay = [0.025, 0.026, 0.029, 0.028, 0.03, 0.031, 0.032, 0.033, 0.04] # Секунды
pause = 0
t1, t2 = 0, 0
 
while True:
    check_main_mask()
    if flag_mask:
        check_click()
        while flag_click:
            t2 = time.time()
            if t2 - t1 >= pause:
                if_click()
                pyautogui.click()
            check_main_mask()
            check_click()
Пройдемся по коду.

Импортировал win32api для того, чтобы отслеживать нажатые клавиши. Импортировал pyautogui для того, чтобы кликать. Между кликами есть интервал, который случайно выбирается из множества delay, вот именно для работы с этим импортировал time и random.

Переменные

flag_mask, flag_click - флаги состояний режимов. Если было отловлено Ctrl + G, то flag_mask становится True, если он до этого был True и программа снова отловит это сочетание клавиш, то этот флаг становиться False. Точно также работает flag_click, только он хранит состояние нажатия, самим пользователем, только ЛКМ. Если флаг стал True, то программа начнет кликать, но когда пользователь снова нажимает ЛКМ, программа перестает кликать. Стоит отметить, что если Ctrl + G было отловлено, когда программа кликала(flag_mask=True, flag_click=True), то flag_mask и flag_click становятся False и программа перестает кликать.

delay - множество из которого случайно выбирается число, которое станет паузой между кликом, который сделает программа и кликом, который будет она еще сделает, если пользователь, конечно, не прервет процесс.

pause - это переменная, которая случайно принимает одно из значений delay. Эта переменная и станет паузой.

t1 и t2 - нужны для таймера, для отмера времени, между кликами, которые делает программа. *1 Программа делает t1 = time.time(), после этого программа, отслеживая сочетания клавиш(Ctrl+G или ЛКМ), параллельно делает t2 = time.time() и если разница t2 - t1 >= pause, то программа кликает и процесс возвращается в точку *1, если пользователь, конечно, не введет какое-либо сочетание клавиш(Ctrl+G или ЛКМ).



Функции

def check_main_mask(). Функция, которая нужна для отслеживания сочетания клавиш Ctrl + G. Если flag примет значение -127 или -128(в зависимости от того, в какой раз было поймано это сочетание в нечетный или в четный, соответственно), значит было отловлено данное сочетание клавиш(Ctrl+G). Если же, значение флага равно 0 или 1(в зависимости от какой раз до этого момента было поймано это сочетание клавиш в нечетный или в четный, соответственно), значит можно сказать, что пользователь не вводил Ctrl+G. Последняя проверка в коде нужна для того, чтобы выполнялось последнее условие отношений флагов flag_mask и flag_click.

def check_click(). Данная функция выполняет такую же роль как и прошлая, только отлавливает ЛКМ, которую нажимает пользователь. Только если flag_click был равен False(т.е. программа не кликала), то данная функция делает флаг True и вызывает функцию if_click().

def if_click(). Данная функция выбирает случайное значение для pause из delay, а также устанавливает t1.


Сам цикл
В начале цикл отслеживает сочетание клавиш(Ctrl+G). Пока пользователь не нажмет данное сочетание клавиш, мы не сможем пройти первый if. Когда пользователь нажмет Ctrl+G. Программа начнет отлавливать и ЛКМ и Ctrl+G. Если пользователь нажмет ЛКМ(flag_click станет True), то программа войдет во внутренний цикл, который делает клики и параллельно отслеживает сочетания клавиш(ЛКМ и CTRL+G), чтобы программа перестала кликать.


Проблематика
Во-первых, программа не может точно сразу отловить сочетание клавиш(оно может и сразу словить его, а может нужно будет нажать несколько раз и тогда она его словит).Я специально не использовал time.sleep, а игрался с t2 - t1, т.к. если использовать time.sleep, то поймать сочетания клавиш становится вообще маловероятным.
Во-вторых, программа делает очень мало кликов в секунду, всего лишь 10 CPS. Хотя интервалы довольно маленькие.


Прошу помощи, можно просто в виде подсказок, какие библиотеки лучше применять и как граматно переписать код. Большое спасибо, что дочитали до этого момента!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.09.2022, 23:24
Ответы с готовыми решениями:

Кликер
Надо, что бы программа на питоне версии 3 и выше самостоятельно нажимала на нужную кнопку клавиатуры или мыши. Какая библиотека для этого...

Нужен кликер
Добрый день, такой вопрос, требуется много раз скопировать текст из excel вставить его в браузер в поисковую строку, нажать поиск по том...

Кликер
Здравствуйте, я хотел написать кликер при помощи фреймворка Kivy, у меня есть исходник: from kivy.app import App from...

3
78 / 73 / 19
Регистрация: 18.05.2021
Сообщений: 287
20.09.2022, 22:21
Лучший ответ Сообщение было отмечено Tarkel как решение

Решение

когда было нажато ЛКМ, то программа начинает кликать. Если было снова нажато ЛКМ
Вы уверены, что нажатие мышью с помощью pyautogui не вызовет прекращение кликов? Я понимаю, что программа работает - значит не вызовет, но не лучше ли поставить проверку на правую кнопку мыши вместо левой?

Я обычно использую для мониторинга клавиатуры pynput. Эта же библиотека позволяет и управлять мышью/клавиатурой - не нужен будет pyautogui. Попробуйте - может лучше фиксироваться нажатия будут. Но не факт.

П.С.
Вам точно нужно, чтобы программа работала в фоне, включаясь в активный режим по хоткею? Не лучше ли будет запускать эту программу по необходимости, сразу настроив на срабатывание по нажатию мыши? (например, по нажатию на среднюю кнопку - уж она вряд ли понадобится, пока будет открываться нужное окно) Или если и правда нужно, то не лучше ли будет посадить на нужный хоткей запуск программы непосредственно через системные возможности? Не будут зря ресурсы расходоваться.

Добавлено через 22 минуты
Код я бы писал примерно так:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import time
 
pause = 0.1 # пауза между кликами
t = time.time() # контроль за временем между кликами
flag = -1
is_clicking = -1
 
def click():
    # здесь типа код для кликанья мышью
    print("click")
 
def monitoring():
    # здесь типа отслеживание хоткеев/ мыши и т.д.
    # как например, в случае нажатия правой кнопки мыши вернёт 1, 
    # в случае нужной комбинации мыши - 2
    # ничего не нажато - 0
    return 0
 
while True: # опять таки, я бы завершал прогу по хоткею, а запускал, настроив хоткей в системе.
    if flag == 1:
        if is_clicking == 1:
            if (time.time() - t) >= pause:
                click()
                t = time.time()
    
    match monitoring():
        case 1:
            is_clicking *= -1
        case 2:
            flag *= -1
2
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
21.09.2022, 08:09
Цитата Сообщение от -_human_- Посмотреть сообщение
Не лучше ли будет запускать эту программу по необходимости
Во, прям с языка снял. По тому же самому Ctrl+G
0
0 / 0 / 0
Регистрация: 19.08.2022
Сообщений: 6
21.09.2022, 22:40  [ТС]
Ладно, спасибо большое, что помогли советом, я переписал кликер, поставив его активацию просто на боковую клавишу мыши, без активации щелчком.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.09.2022, 22:40
Помогаю со студенческими работами здесь

Kivy кликер
В данном коде from kivy.app import App from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout from...

Кликер на Python
Ну в общем начну с того что хочу с вашей помощью написать мини ботика кликер для игрульки. Есть эмулятор андроида к примеру возьмём NOX для...

Кликер на андроид
Здравствуйте. Я написал небольшой кликер на python (в windows) и с ним проблем нет, но хотелось бы как-то отвязать мышь, чтобы кликанье ...

Кликер на Python 3(не работает)
Здравствуйте!:) Я делал кликер на python 3, но код не работает как нужно, помогите пожалуйста!:wall: - это код. - это результат. ...

Кликер: не работает кнопка
from tkinter import * tk = Tk() tk.title('Clicker by Sasha') btn = Button(text='+', width=15, height=7) btn.pack() btn =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru