是否曾经想要编写一个程序来记录并模拟特定的键盘和鼠标操作,但不知道如何开始?解决方案。
在创建新表单时,Microsoft Visual Studio总是会将最常用的引用放入一个列表中,并等待使用它们(比如System
、System.Drawing
、System.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
以及它有多复杂,它可能会浪费几秒钟。
现在这些小问题已经解决了,让看看现在可以做什么!
首先,让看看旧表单:
现在看看新表单:
新表单具有这些升级的规格:
知道人们会问,但没有包括一个序列化器来保存鼠标或键盘移动。保存鼠标事件是一件痛苦的事情(因为需要分解事件并为每个内部对象创建不同的变量)。尽管如此,如果保存了鼠标移动,然后将其带到另一个具有不同屏幕分辨率的计算机系统,可能会得到一个越界指针异常。这是一个需要进行大量错误更正才能正常工作的混乱。
既然解释了为什么没有包括一个保存按钮,让继续。
全局热键通过在Windows.Forms下设置一个System IntPtr结构来工作,从输入的键码和修饰符。当热键被按下时,有一个被激活的受保护的覆盖void。从那个void,它运行另一个void,称为HandleHotkey,以处理热键事件。
后工作者和进度条相当简单;它做了为播放编程的事情,另外增加了三件事。
隐藏窗口和停止选择是简单的选项,顾名思义。值得注意的是,在更改进度条的值之前,会检查是否选中了隐藏窗口,以防止在隐藏表单时更改设计器项的状态时出现的异常。