-1

このプログラムを C# で作成しました。

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

        private void button1_Click(object sender, EventArgs e)
        {
            delay = int.Parse(textBox2.Text);
            timer1.Interval = delay;
            timer1.Enabled = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Enabled = false;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
                String textt = textBox1.Text;
                SendKeys.SendWait(textt);
        }
    }
}

ほとんどの場合問題なく動作し、キーをすばやく送信できます。

しかし、たとえば 10 MS の遅延を挿入すると、「停止」ボタンをクリックして停止するのが非常に難しくなります。送信を停止する唯一の方法は、プログラムを閉じることですが、私はそれをしたくありません。

とにかく、プログラム内のボタンを押す能力を損なうことなく、5-10 MS のように非常に迅速にキーを送信できますか? 早送りでクリックできない…

4

3 に答える 3

1

問題を再現できました。アプリは 10 ミリ秒ごとにキーストロークを送信しています。私にとって、アプリがフリーズを引き起こしていることはまったく驚くべきことではありません。10 ミリ秒ごとのキーストロークは、アクティブなアプリにとってかなりの集中砲火です。スレッド化は役に立ちません。なぜこの行動は驚くべきものなのですか?

つまり、メッセージ ポンプを過負荷にすると、うまくいくとは思えません。

using System;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Spammer//your own namesapce
{
    public partial class Form1 : Form
    {
        int delayInMilliseconds, y = 1;
        private Timer timer1;

        public Form1()
        {
            InitializeComponent();
            //StartTimerWithThreading();       
            SetupTimer();
        }

        void StartTimerWithThreading()
        {
            Task.Factory.StartNew(() =>
                {
                    SetupTimer();
                });
        }

        void SetupTimer()
        {
            timer1 = new Timer();//Assume system.windows.forms.timer
            textBox2.Text = "10";//new delay
            timer1.Tick += timer1_Tick;//handler
        }

        private void button1_Click(object sender, EventArgs e)
        {
            delayInMilliseconds = int.Parse(textBox2.Text);
            timer1.Interval = delayInMilliseconds;
            timer1.Enabled = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Enabled = false;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            String textt = textBox1.Text;
            SendKeys.SendWait(textt);
        }

    }
}
于 2013-10-28T15:58:36.387 に答える
0

Click簡単な解決策は、ボタンのイベント ハンドラーにコードを追加する代わりに、イベント ハンドラーが必要ですMouseDown

//MouseDown event handler for the button2
private void button2_MouseDown(object sender, EventArgs e) {
   timer1.Enabled = false;
}

または、イベント ハンドラーを引き続き使用することもできますが、キーは次のようでないClick場合にのみ送信されます。MouseButtonsLeft

private void timer1_Tick(object sender, EventArgs e) {
   String textt = textBox1.Text;
   if(MouseButtons != MouseButtons.Left) SendKeys.Send(textt);
}
//then you can freely click your button to stop it.
于 2013-10-28T18:04:03.590 に答える