首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在定时器内运行定时器?

如何在定时器内运行定时器?
EN

Stack Overflow用户
提问于 2012-01-07 04:51:28
回答 2查看 158关注 0票数 0

我有一个应用程序,使用一个循环来键入文本的时间间隔。现在,我希望输入的文本在每个字符之间留有较小的空格。

我已经尝试过这段代码,但当我启动计时器时,在第二个计时器中输入仍在继续。在我的第一次,没有空格来计时我的行数。

代码语言:javascript
复制
private List<char> charList = new List<char>();

public AutoTyper()
{
    InitializeComponent();

    tmrInterval.Tick += new EventHandler(Interval);
    tmrDelay.Tick += new EventHandler(Delay);
    tmrSpace.Tick +=new EventHandler(charSpaces);
    txtText.TextChanged += new EventHandler(TextChanged);
    tbType.SelectedIndexChanged += new EventHandler(IndexChanged);
}

private void Interval(object sender, EventArgs e)
{
    if (cbPause.Checked == false)
    {
        SendKeys.Send(txtText.Text + "{enter}");

        if (tbType.SelectedTab == tbInterval)
        {
            tmrInterval.Interval = int.Parse(nudInterval.Value.ToString());
        }

        if (tbType.SelectedTab == tbRange)
        {
            tmrInterval.Interval = random.Next(int.Parse(nudMin.Value.ToString()), int.Parse(nudMax.Value.ToString()));
        }
    }
    else if (cbPause.Checked == true)
    {
        tmrSpace.Enabled = true;
    }
}

private void charSpaces(object sender, EventArgs e)
{
    Random random = new Random();
    tmrSpace.Interval = random.Next(200, 400);

    foreach (char character in charList)
        SendKeys.Send(character.ToString());
    SendKeys.Send("{enter}");
}

编辑,我已经尝试使用线程睡眠版本,所以我已经删除了次数。我现在所拥有的一切都是跟随,但它停止了我的电脑。

代码语言:javascript
复制
private void Interval(object sender, EventArgs e)
{
    if (cbPause.Checked == false)
    {
        SendKeys.Send(txtText.Text + "{enter}");

        if (tbType.SelectedTab == tbInterval)
        {
            tmrInterval.Interval = int.Parse(nudInterval.Value.ToString());
        }

        if (tbType.SelectedTab == tbRange)
        {
            tmrInterval.Interval = random.Next(
                int.Parse(nudMin.Value.ToString()), 
                int.Parse(nudMax.Value.ToString()));
        }
    }
    else if (cbPause.Checked == true)
    {
        Random random = new Random();

        foreach (char character in charList)
        {
            SendKeys.Send(character.ToString());
            Thread.Sleep(random.Next(400, 500));
        }

        SendKeys.Send("{enter}");
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-08 11:33:16

使用计时器比暂停线程要好得多。我是这样做的:

代码语言:javascript
复制
    private void Space(object sender, EventArgs e)
    {
        SendKeys.Send(txtText.Text.Substring(b++, 1));

        tmrSpace.Interval = random.Next(50, 150);

        if (b == txtText.TextLength)
        {
            tmrSpace.Enabled = false;
            SendKeys.Send("{enter}");
        }
    }

    private void Interval(object sender, EventArgs e)
    {
        if (cbPause.Checked)
        {
            b = 0;

            tmrSpace.Interval = random.Next(50, 150);
            tmrSpace.Enabled = true;
        }
        else
        {
            SendKeys.Send(txtText.Text + "{enter}");

            if (tbType.SelectedTab == tbRange) tmrInterval.Interval = random.Next(int.Parse(nudMin.Value.ToString()), int.Parse(nudMax.Value.ToString()));
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2012-01-07 05:00:50

如果希望每个字符之间有较短的空格,我只需使用Thread.Sleep()即可。

代码语言:javascript
复制
Random r = new Random();

foreach (char character in charList)             
{
    SendKeys.Send(character.ToString()); 
    // sleep for between 200 and 400 milliseconds
    Thread.Sleep(r.Next(200, 400));
}

使用计时器来做这样的事情太夸张了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8764338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档