c# - 自动点击器计算
问题描述
我正在制作自动点击程序,但我已经遇到了问题。我希望我的程序能够按照用户想要的方式更改每秒点击次数字段。所以我做了这个。
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。
解决方案
因此,操作员键入一些应该表示一段时间(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?
}
}
推荐阅读
- html - CSS flex 对齐按钮
- java - 我无法暂停 TTS(特别是 Earcon)
- javascript - 如何在 React 中强制重新渲染功能组件?
- javascript - 如何在文本区域内动态渲染数学符号?
- javascript - 无效的 Web 服务调用,参数缺失值:“档案”
- postgresql - 无法使用 text[] 数据类型创建表
- swift - 尝试重新创建 SwiftUI 列表演示时出现错误“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”
- python - 如何使用 mod_wsgi 在单个域下托管多个 django 项目?
- c# - 如何根据一些黑名单获取列表项
- docker - Zeppelin 不会使用 conf/zeppelin-site.xml 文件