Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
4 / 4 / 0
Регистрация: 19.08.2013
Сообщений: 138

Пауза в автокликере

16.05.2018, 19:50. Показов 1522. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Написал автокликер, который бы не палился, то есть имитировал реальные действия мышью. Вдруг кому-нибудь пригодится. Писал под конкретную задачу, поэтому не предусмотрел всего. Как им пользоваться:

1) делаем принтскрин в той ситуации, в которой собираемся использовать автокликер
2) запускаем DiceBotDeveloping (DiceBotDeveloping.7z), прописываем путь к сделанному принстскрину
3) жмем ОК, программа разворачивается на весь экран и показывает указанный принстскрин
4) теперь нажимаем S и начинается запись. Программа умеет записывать только движения и клики левой кнопки, но вы можете легко добавить нужный функционал
5) еще раз нажимаем S. Запись прерывается и сохраняется в "D:\MouseLog.Json"
Всю эту катавасию с принтскрином я затеял что бы не связываться с глобальными хуками: гораздо проще перехватить действия мыши на своей форме.
6) придумываем, как можно обрабатывать эту запись. Ведь если мы будем каждый раз запускать одинаковую последовательность мышиных действий, это будет мало похоже на работу реального пользователя.
7) что бы воспроизвести эту запись, запускаем DiceBot (DiceBot.7z)
Использовал информацию отсюда: "Имитация нажатия мыши" и отсюда: "Координаты курсора мыши". Если у вас не собираются проекты, посмотрите, должен быть установлен .NET 4.7.

Теперь вопрос:
Как происходит запись: при каждом вызове событий мыши (MouseMove, MouseDown, MouseUp) программа добавляет запись в List, включая в нее количество миллисекунд, прошедшее с момента предыдущего вызова события. Воспроизведение же этого события происходит следующим образом:
C#
1
2
Thread.Sleep(mouseEvent.Time);
//Далее вызываем функцию из WinAPI
Проблема в том, что во время записи события мыши вызываются настолько часто, что время между ними чаще всего равняется 1 или 0 миллисекунд. То есть, с одной стороны, хорошо бы использовать более мелкие единицы времени - такты (ticks).
Но попробуем запустить код:
C#
1
2
for (int i = 0; i < 10000; i++)
    Thread.Sleep(1);
У меня он отработал за 20 секунд. Получается, с другой стороны, Thread.Sleep не дает достаточной точности уже при работе с одной миллисекундой. Что же делать? Как будет правильнее - просто оставить как есть? В любом случае, своей цели я, кажется, достиг, остальное уже не так важно. Спасибо за внимание.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.05.2018, 19:50
Ответы с готовыми решениями:

Пауза на 7 секунд или пауза до нажатия клавиши
Для загрузчика надо сделать паузу, длящуюся 7 секунд, во время которой, если пользователь нажмет клавишу, происходит выход из паузы, или...

Пауза
Добрый день! Подскажите, как можно задать паузу, точнее какая команда для этого используется. Мне нужно чтобы ролик дойдя до определенного...

Пауза
Не без вашей помощи никак :drink: в общем, нужен скрипт паузы то есть, пример : Private Sub Form_Load() ' мой 1 код...

6
4 / 4 / 0
Регистрация: 19.08.2013
Сообщений: 138
16.05.2018, 19:58  [ТС]
UPD здесь оказался неправильный вариант программы. Правильный вот: DiceBotDeveloping.7z.
0
0 / 0 / 0
Регистрация: 27.01.2017
Сообщений: 12
18.05.2018, 09:54
Цикл тоже кушает процессорное время, отсюда и неточность...
0
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
20.05.2018, 03:00
Task.Delay(TimeSpan.FromTicks(100)).Wait (); лучше используй.
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
20.05.2018, 14:38
Defences, тогда уж лучше
C#
1
await Task.Delay(...);
0
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
27.06.2019, 15:12
OwenGlendower, не лучше, если мы кроме паузы нигде в методе не используем await и метод void, так как это даст выход из метода, создание потока, в итоге запутанность и тонны времени на поиск причин ошибки.

P.s еще соль добавляет то что мы не можем применить await или .Wait(); к void методу
Вот пример

1)Просто Task.Delay.Wait();
выход:
A
bb
C#
1
2
3
4
5
6
   static void Main(string[] args)
        {
            var a = new A();
            a.Test();
            Console.ReadKey();
        }
1) await Task.Delay();
выход:
bb
A
C#
1
2
3
4
5
6
   static void Main(string[] args)
        {
            var a = new A();
            a.TestAsync();
            Console.ReadKey();
        }
C#
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
 class A
    {
        public void TestAsync()
        {
           AsyncTest();
            Console.WriteLine("bb");
        }
        public void Test()
        {
            TestWait();
            Console.WriteLine("bb");
        }
 
        private async void AsyncTest()
        {
 
            await Task.Delay(1000);
            Console.WriteLine("A");
 
        }
 
        private void TestWait()
        {
            Task.Delay(1000).Wait();
            Console.WriteLine("A");
 
        }
    }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
27.06.2019, 22:45
Defences, если в коде не используется async/await, то и не надо использовать в нем "чужие" примитивы. Обычный Thread.Sleep() лучше подойдет.

Пример неудачный получился. Проблема возникает из-за неверного применения асинхронности. Вместо async void следует использовать async Task, что позволить использовать как await так и .Wait(). Метод Main начиная с C# 7.1 тоже можно объявлять как async. В итоге это исправляет ошибку
C#
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
    class Program
    {
        static async Task Main(string[] args)
        {
            var a = new A();
            //a.Test();
            await a.TestAsync();
            //Console.ReadKey();
        }
    }
 
    class A
    {
        public async Task TestAsync()
        {
            await AsyncTest();
            Console.WriteLine("bb");
        }
        public void Test()
        {
            TestWait();
            Console.WriteLine("bb");
        }
 
        private async Task AsyncTest()
        {
 
            await Task.Delay(1000);
            Console.WriteLine("A");
 
        }
 
        private void TestWait()
        {
            Task.Delay(1000).Wait();
            Console.WriteLine("A");
 
        }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.06.2019, 22:45
Помогаю со студенческими работами здесь

Пауза
Есть 2 метода один меняет label.Image на одну картинку, другой на другую. Не могу сделать между этитми методами паузу, чтобы взуально было...

Пауза
Здравствуйте) как реализовать паузу в плеере с помощью winmm.dll есть команда pause, которая вроде как останавливает...и команда...

Пауза в коде
Как сделать паузу в коде: procedure Tindex.Button_startClick(Sender: TObject); var s:integer; // Переменная для кол-во строк var...

Пауза в потоке
Нужна помощь. В программе работают 2 потока одновременно, посылают запросы в сеть, могут получать капчу. Вот собственно вопрос, если 1...

Пауза в милисекундах
Нужно сделать паузу по типу Thread.Sleep(100); или Delay(100); ... Пробовал Task.Delay(100); но не работает совсем.


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru