2016-03-08 2 views
1

Я пытаюсь сделать очень простой автокликер на C#, чтобы поправиться.Нарушение цикла while и сна

У меня есть форма с двумя числовыми текстовыми полями и двумя кнопками. В первом текстовом поле указывается, сколько времени должно быть между каждым кликом (в msec), а во втором текстовом поле указывается количество итераций.

Первая кнопка у меня есть button1, которая по сути только запускает программу. У меня есть вторая кнопка: button2, которая остановит функцию button1_Click.

Вот что у меня есть:

private void button1_Click(object sender, EventArgs e) 
{ 
    //While a is less than number of specified iterations 
    for (int a = 0; a < Convert.ToInt32(numericUpDown2.Value); a++) 
    { 
     //Sleep for desired time 
     System.Threading.Thread.Sleep(Convert.ToInt32(numericUpDown1.Value)); 

     //Get x/y coordinates of mouse 
     int X = Cursor.Position.X; 
     int Y = Cursor.Position.Y; 

     //Click mouse at x/y coordinates 
     mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0); 
    } 
} 

public void Form_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Escape) 
    { 
     this.Close(); 
    } 
} 

Моя проблема заключается в том, что моя программа застревает в том, что цикл, и у меня нет никакого способа сломать функцию button1_Click.

Я хочу, чтобы, если я нажму F11 или мою кнопку button2, функция button1_Click немедленно остановится, но сама форма все равно будет открыта. Прямо сейчас я просто использую ключ ESC просто для простоты.

+10

спишь нить UI так приложение * будет * перестает отвечать на запросы. Вам нужно взглянуть на использование правильного таймера. – ChrisF

+0

В WPF/C# вы можете использовать RepeatButton, как описано здесь: https://msdn.microsoft.com/en-us/library/ms750603(v=vs.85).aspx –

+0

Не могли бы вы просто сделать цикл while в одной кнопке то есть, пока кнопка 2 не активирована? – Jacobr365

ответ

1

Добавить объект «Таймер» в форму, установите это интервал в миллисекундах «сна» (не совсем). Установите для свойства Enabled значение false.

Обращайтесь к этому тику событий и поместите туда весь свой код внутренней линии (вызов mouse_event).

В button1_Click (buttonStart будет лучшим именем), установите таймер Enabled равным true, а в button2_Click (buttonStop) установите таймер Enabled равным false.

0

Что-то вроде этого

public Timer myTimer { get; set; } 

public Form() 
{ 
    myTimer = new Timer(); 
    myTimer.Tick += new EventHandler(TimerEventProcessor); 
} 

private void button1_Click(object sender, EventArgs e) 
{  
    myTimer.Interval = Convert.ToInt32(numericUpDown1.Value); 
    myTimer.Start(); 
} 

public void Form_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Escape) 
    { 
     myTimer.Stop(); 
     this.Close(); 
    } 
} 

private static void TimerEventProcessor(Object myObject, EventArgs myEventArgs) 
{ 
    //Get x/y coordinates of mouse 
    int X = Cursor.Position.X; 
    int Y = Cursor.Position.Y; 
    //Click mouse at x/y coordinates 
    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0); 
} 
-1
Timer t1; 
int ticks = 0; 
bool timerInitialized = false 
private void button1_Click(object sender, EventArgs e) 
{ 
    if (!timerInitialized) 
    { 
    t1 = new Timer(); 
    t1.Tick += Timer_Tick; 
    timerInitialized = true; 
    } 
    button1.Enabled = false; 
    t1.Interval = Convert.ToInt32(numericUpDown1.Value); 
    ticks = 0; 
    t1.Start(); 
} 

private void Timer_Tick(object sender, EventArgs e) 
{ 
    if (ticks < Convert.ToInt32(numericUpDown2.Value)) 
    { 
    ticks++; 

    //Get x/y coordinates of mouse 
    int X = Cursor.Position.X; 
    int Y = Cursor.Position.Y; 
    //Click mouse at x/y coordinates 
    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0); 
    } 
    else 
    { 
    t1.Stop(); //You could Call Stop from every where e.g. from another Button 
    button1.Enabled = true; 
    } 
} 

EDIT: Присвоить «Тик» событие только один раз

+1

Вы делегируете метод Timer_Tick на каждый щелчок Button1. Это не хорошо. –

+0

@JamesDev, это правда, я исправил фрагмент. – Pazi01

Смежные вопросы