Как набирать символы в интервале? - PullRequest
0 голосов
/ 07 января 2012

Я пишу программу, которая будет вводить строку текста с интервалом в 5 секунд. Теперь я пытаюсь добавить функцию, которая будет печатать текст за символом с небольшими пробелами между символами. Я пытаюсь использовать Thread.Sleep, но моя программа вылетает, и я не знаю, почему.

Как это сделать правильно?

    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(1000);
            }

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

    private void btnStart_Click(object sender, EventArgs e)
    {
        if (txtText.TextLength < 1 || txtText.Text == string.Empty)
        {
            lblMessage.Text = "You must type text to proceed!";
            btnStart.Enabled = false;
        }
        else
        {
            foreach (char character in txtText.Text)
            {
                charList.Add(character);
            }

            if (tbType.SelectedTab == tbInterval)
            {
                tmrDelay.Enabled = true;

                txtText.Enabled = false;
                nudInterval.Enabled = false;
                nudMin.Enabled = false;
                nudMax.Enabled = false;
                btnStart.Enabled = false;
                btnStop.Enabled = true;
            }

            if (tbType.SelectedTab == tbRange)
            {
                tmrDelay.Enabled = true;
                tbType.Enabled = false;
                txtText.Enabled = false;
                nudInterval.Enabled = false;
                nudMin.Enabled = false;
                nudMax.Enabled = false;
                btnStart.Enabled = false;
                btnStop.Enabled = true;
            }

            lblMessage.Text = "Starting auto typing in: 3";
        }
    }

1 Ответ

3 голосов
/ 07 января 2012

Если вы позвоните Thread.Sleep, это приведет к зависанию вашего потока графического интерфейса.

То, что я хотел бы сделать, это использовать System.Windows.Forms.Timer, и каждый Tick, указывать следующий символ.

public partial class Form1 : Form
{
    Timer timer;
    string str;
    int char_num;

    public Form1()
    {
        InitializeComponent();
        timer = new Timer();
        timer.Tick += timer_Tick;
    }

    void timer_Tick(object sender, EventArgs e)
    {
        SendKeys.Send(str.Substring(char_num++, 1));
        if (char_num == str.Length)
            timer.Stop();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        textBox1.Focus();
        str = "Jonathon";
        char_num = 0;
        timer.Interval = 1000;
        timer.Start();
    }
}

Примечание. Если это не очевидно, для этого кода требуется форма с textBox1 и кнопкой, для которой событие Click связано с button1_Click().

Если вы хотите, чтобы первый символ был отправлен сразу, вы можете «обмануть», вызвав обработчик Tick сразу после запуска таймера, добавив следующую строку:

timer_Tick(null, EventArgs.Empty);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...