全局鼠标与键盘录制与模拟工具的改进

是否曾经想要编写一个程序来记录并模拟特定的键盘和鼠标操作,但不知道如何开始?解决方案。

在创建新表单时,Microsoft Visual Studio总是会将最常用的引用放入一个列表中,并等待使用它们(比如SystemSystem.DrawingSystem.Windows.Forms)。基本上,这些额外的项目被加载并站在那里,希望能使用它们。然而,如果不使用它们,它们会减慢应用程序的启动和响应时间。

移除了所有不需要运行程序的引用。

应用程序启动时间的差异非常明显。当然,需要移除using引用,才能在整个应用程序中看到性能提升。

在那之后,对代码进行了一些空白清理。一个完美的例子是,当在form.designer之外尝试做表单设计器代码时,不需要输入所有:

C# mouseHook.MouseMove += new MouseEventHandler(mouseHook_MouseMove);

只需要输入:

C# mouseHook.MouseMove += mouseHook_MouseMove;

编译器会完成其余的工作。

现在让谈谈大多数人几乎不关心但非常重要的话题。让谈谈线程安全

线程安全是最喜欢的话题,因为多线程程序在当今社会变得越来越普遍。这与race conditions/hazards有关。如果正在制作一个程序来执行一个设置的过程;想要确保它在执行该过程时不会出现与其他线程运行的问题。

在C#中,拥有将属性分配给控制属性的语义的终极力量。当分配属性时,有机会改变它的内存可见性语义。

举个例子,当有一个字段不会改变它的值或它的含义时:

C# private KeyboardHook keyboardHook = new KeyboardHook();

可以添加一个readonly字段:

C# private readonly KeyboardHook keyboardHook = new KeyboardHook();

使其线程安全。它改变了值是如何编译和声明的。对于readonly阅读这个,以获取有关其工作原理及其重要性的更多信息。

现在让进行冗余检查。

当初始化一个字段时,不要担心一个值是否同时附加到它。只要确保当字段被使用时它将有一个值。MacroForm是一个非常好写的程序,只有一个字段具有冗余的默认值。

它是lastTimeRecorded int字段。它之所以冗余,是因为在首次使用时,它被初始化为Environment.TickCount。所以它完全覆盖了默认值。当做一个int时,这没有区别,但如果做一个object,这取决于object以及它有多复杂,它可能会浪费几秒钟。

新增功能

现在这些小问题已经解决了,让看看现在可以做什么!

首先,让看看旧表单:

现在看看新表单:

新表单具有这些升级的规格:

  • 按钮只在需要时启用。
  • 布尔值,用于查看程序是否正在录制或是否已经说过热键警告。
  • 一个后工作者(称为Playworker),用于播放过程(使其可以停止播放)。
  • 播放时隐藏窗口选项。
  • 当鼠标选择表单时停止选项。
  • 集成了最喜欢的全局热键激活。
  • 如果激活了热键,可以启用永久循环,并循环播放直到按下全局热键。
  • 添加了进度条以获取进度报告。

知道人们会问,但没有包括一个序列化器来保存鼠标或键盘移动。保存鼠标事件是一件痛苦的事情(因为需要分解事件并为每个内部对象创建不同的变量)。尽管如此,如果保存了鼠标移动,然后将其带到另一个具有不同屏幕分辨率的计算机系统,可能会得到一个越界指针异常。这是一个需要进行大量错误更正才能正常工作的混乱。

既然解释了为什么没有包括一个保存按钮,让继续。

全局热键通过在Windows.Forms下设置一个System IntPtr结构来工作,从输入的键码和修饰符。当热键被按下时,有一个被激活的受保护的覆盖void。从那个void,它运行另一个void,称为HandleHotkey,以处理热键事件。

后工作者和进度条相当简单;它做了为播放编程的事情,另外增加了三件事。

  • 在告诉后工作者做工作之前,记录的事件被计数并设置为进度条最大值。
  • 然后,一个内部变量计算后工作者运行的事件,并将该值输出到进度条。
  • 在运行下一个事件之前,会检查是否有待处理的取消;如果有,它退出foreach命令。

隐藏窗口和停止选择是简单的选项,顾名思义。值得注意的是,在更改进度条的值之前,会检查是否选中了隐藏窗口,以防止在隐藏表单时更改设计器项的状态时出现的异常。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485