-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 毫秒时,很难单击“停止”按钮来停止它。停止发送的唯一方法是关闭程序,我不想这样做。

无论如何我可以非常快速地发送密钥,比如 5-10 MS,而不会影响我按下程序内部按钮的能力?快速发送时我无法点击...

4

3 回答 3

3

问题是您正在使用SendWait. 这将等待目标应用程序响应——当这种情况发生时,您的应用程序将无法响应用户输入。如果您使用Send而不是SendWait,您的 UI 线程将不会被阻止等待按键被处理。

于 2013-10-28T15:54:26.877 回答
1

我能够重现该问题。该应用程序每 10 毫秒发送一次击键。对我来说,该应用程序导致冻结一点也不奇怪。每 10 毫秒击键一次,对于活跃的 App 来说是一个相当大的弹幕。线程不会有帮助。为什么这种行为令人惊讶?

换句话说,当我超载消息泵时,我不希望事情能顺利进行。

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 回答