我试图在C#中创建一个非常简单的自动转换器,只是为了让它变得更好。
我有一个带有两个数字文本框和两个按钮的表单。第一个文本框指定每次单击之间应该有多长时间(以毫秒为单位),第二个文本框指定迭代次数。
我的第一个按钮是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();
}
}
我的问题是我的程序停留在for循环中,我无法打破button1_Click
函数。
我想要它,这样如果我按F11或我的button2
按钮,button1_Click
功能将立即停止,但表单本身仍将打开。现在我只是为了简单起见而使用ESC
密钥。
答案 0 :(得分:1)
添加&#39;定时器&#39;反对您的表单,将其间隔设置为“睡眠”的毫秒数。 (并不是的)。将它的Enabled属性设置为false。
处理它的Tick事件并将所有内循环代码放在那里(mouse_event调用)。
在button1_Click(buttonStart是一个更好的名字)中,将timer Enabled设置为true,并在button2_Click(buttonStop)中将timer enabled设置为false。
答案 1 :(得分: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);
}
答案 2 :(得分:-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;
}
}
编辑: 分配&#34; Tick&#34;事件只有一次