SendKeys конфликтует с кнопками приложения Windows Forms

Недавно я сделал это небольшое приложение Windows Forms:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace Spammer
{
    public partial class Form1 : Form
    {
        Thread t1;
        int delay, y = 1;
        public Form1()
        {
            t1 = new Thread(send);
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            delay = int.Parse(textBox2.Text);
            t1.Start();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            y = 0;
        }
        private void send()
        {
            while (y == 1)
            {
                String textt = textBox1.Text;
                Thread.Sleep(delay);
                SendKeys.SendWait(textt);
            }
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {

        }
    }
}

Теперь это выглядит так:

Он имеет текстовое поле «Задержка», текстовое поле «Текст для отправки» и 2 кнопки: «Пуск» и «Стоп».

Теперь я попытался запустить его и установить задержку на 1000 мс.

Когда я нажимаю кнопку "Стоп", он отлично останавливается, и сообщения больше не отправляются.

Но когда я ввожу в задержку очень маленькие задержки, например, 100 мс, нажатие «Стоп» ничего не делает. Даже как-то сложно щелкнуть по нему, и даже когда я нажимаю, не прекращается отправка сообщений.

Почему это? И можно ли это как-то решить?


person BlueRay101    schedule 21.10.2013    source источник
comment
Это связано с тем, что перевод формы в режим ожидания заставляет ее игнорировать ввод в течение всего времени. Для человека 100 мс почти всегда переводят его в режим ожидания.   -  person Logarr    schedule 21.10.2013
comment
Ну, конечно, не так-то просто переключиться на другое окно, чтобы нажатия клавиш оказались в нужном месте. И обратно, чтобы нажать кнопку «Стоп». Все в пределах 100 миллисекунд, вы должны быть довольно гибкими. Вам нужно будет переосмыслить это, это просто не очень удобно.   -  person Hans Passant    schedule 21.10.2013
comment
Из документа (msdn.microsoft.com/ en-us/library/): Класс SendKeys подвержен проблемам с синхронизацией, которые некоторым разработчикам приходится решать..   -  person RBarryYoung    schedule 21.10.2013
comment
Понятно... Итак, что я могу здесь сделать, чтобы все заработало? Или я могу сделать что-то подобное, что работает? Мне нужно что-то с задержкой пользовательского ввода для работы... Так это возможно как-то?   -  person BlueRay101    schedule 21.10.2013


Ответы (1)


Ок, спасибо всем за помощь!

Сейчас я использую таймер с графическим интерфейсом, и он работает безупречно.

person BlueRay101    schedule 21.10.2013