首页 > 解决方案 > 自动点击器计算

问题描述

我正在制作自动点击程序,但我已经遇到了问题。我希望我的程序能够按照用户想要的方式更改每秒点击次数字段。所以我做了这个。

private void textBoxCps_TextChanged(object sender, EventArgs e)
{
    try
    {
        time = Convert.ToDouble(textBoxCps.Text);
        time = 1000 / time;
        Math.Round(time);
    }
    catch (Exception)
    {

    }
}

数学是对的(我认为......)

while (IsRunning)
{
    if ((Control.ModifierKeys & Keys.Alt) != 0)
    {
        DoMouseClicks();
        Thread.Sleep(Convert.ToInt32(time));
    }
    else
    {

    }
}

当我尝试将 1 CPS 放入文本框时,它每秒点击 1 次,对于 2 和 3 相同,但是当它为 4 或更高时,我得到 3.80 和更低的 CPS。

标签: c#visual-studiowinforms

解决方案


因此,操作员键入一些应该表示一段时间(TimeSpan)的文本,并且在开始运行后,您希望DoMouseClicks每个 TimeSpan 调用方法,直到停止运行。

问题之一是,当您执行此过程时,您希望用户输入具有响应性。

而不是睡眠,您应该使用 Windows 计时器之一。它们有几个,每个都有其优点和缺点。在您的情况下,您使用的计时器取决于您需要的准确性。有关各种计时器之间的比较,请参阅本文

如果用户线程很忙,点击会有点延迟,这是一个问题吗?如果没有,最简单的是System.Timers.Timer

System.Timers.Timer timer = new System.Timers.Timer()
timer.Elapsed += TimerElapsed;

private void TimerElapsed(object sender, ...)
{
    DoMouseClicks();
}

要更改间隔:

TimeSpan TimerInterval
{
    get => TimeSpan.FromMilliseconds(this.timer.Interval);
    set => this.Timer.Interval = value.TotalMilliseconds;
}

我决定使用 TimeSpan 作为间隔时间。如果在将来的版本中您决定让操作员以秒或时间格式(“01:00”)键入他的间隔时间,那么您的代码更改将是最小的

要启动和停止计时器:

private bool IsTimerStarted
{
    get => this.timer.Enable;
    set => this.timer.Enabled = value;
}

现在我们准备好对操作员的输入做出反应。您决定对 TextBoxChanged 采取行动。你确定要这个吗?如果操作员想要输入“1000”来表示一秒的时间间隔,会发生什么情况。他首先键入“1”,您立即开始以 1 毫秒的频率单击鼠标。这是你想要的吗?

另一个问题:如果操作员输入错误:“10)0”,而不是“1000”?

适当的用户界面将让操作员通过按下按钮来指示他已完成输入间隔。按下按钮时,您将阅读文本。如果有错误,则通知操作员,如果没有,则启动计时器。

只要文本框包含无效文本,另一种方法是禁用按钮。虽然这看起来不错,但缺点是操作员不知道为什么他的按钮未启用。

private void OnButtonStart_Clicked(object sender, ...)
{
    TimeSpan intervalTime = this.ReadTextBoxInterval();
    this.TimerInterval = intervalTime;
    this.IsTimerStarted = true;

    // if desired: show the operator that the action is running
}
private void OnButtonStop_Clicked(object sender, ...)
{
    this.IsTimerStarted = false;
    // if the timer was handling event Elapsed, it is finished neatly.

    // if desired show the operator that the action is stopped.
}

我决定将操作与操作员输入的解释分开。这样,如果您决定将操作员输入从毫秒更改为秒,甚至时间格式(“00:01”),则代码更改最少。或者,如果您决定使用 ComboBox 而不是编辑框。

TimeSpan ReadTextBoxInterval()
{
    string textBoxText = this.TextBoxInterval.Text;
    return IntervalFromMsecText(textBoxText);
}

TimeSpan IntervalFromMsecText(string intervalText)
{
    if (Double.TryParse(intervalText, NumberStyles.Any, CultureInfo.CurrentCulture,
        out double msecInterval))
    {
        // input is a proper double
        return TimeSpan.FromMilliseconds(msecInterval);
    }
    else
    {
        // invalid input. Notify the operator?
    }
}

推荐阅读