今天整理电脑,看到这个小工具源码,曾经是为了天猫点红包而写的。若是像今天这样差点删掉了多少有点可惜,虽然没有技术含量,还是决定整理一下分享出来,为开源出一份绵薄之力。
1、工具界面介绍与项目文件介绍
小工具界面如下图,需要说明有两点:
1、延时是指当前操作后,休息多长时间执行下一个动作,不是多长时间后执行本动作。
2、Ctrl+S保存文件,必须保证当前焦点在左栏上(鼠标点击一下左栏即可)。
项目文件如下,其中要说明的是MouseKeyboardActivityMonitor是一个C#实现的鼠标键盘勾子项目,我本人对windows编程不太了解,勾子的含义与用处我也是网上查了查,半知半解!此处我主要是为了实现几个全局的热键(F7、F8、F9)而引入的这个项目。
2、开发过程简单介绍
首先是拖出工具的界面,这个不说了。然后在界面加载后,需要注册一下鼠标键盘勾子(为了在鼠标键盘发生事件时,我能做一些事情)。以下代码在Form1的构造方法中:
//设置鼠标勾子
mhl = new MouseHookListener(new MouseKeyboardActivityMonitor.WinApi.GlobalHooker());
mhl.MouseMove += new MouseEventHandler(mhl_MouseMove);
mhl.Enabled = true;
//设置键盘勾子
khl = new KeyboardHookListener(new MouseKeyboardActivityMonitor.WinApi.GlobalHooker());
khl.KeyDown += new KeyEventHandler(khl_KeyDown);
khl.Enabled = true;
可以看到我利用勾子来向系统注册了两个事件,一个是当鼠标移动时发生的事件,对应的事件处理逻辑就是将鼠标坐标显示到界面上;另一个是键盘有按键按下时发生的事件,事件处理逻辑是:按F7时,我纪录下当前的坐标信息与操作信息(鼠标:左/右单击、左/右双击,延时等);按F8时,交给工作线程去执行纪录下的鼠标命令;按F9时,停止执行。代码如下:
//界面上实时显示鼠标坐标
void mhl_MouseMove(object sender, MouseEventArgs e)
{
txtX.Text = e.X.ToString();
txtY.Text = e.Y.ToString();
}
//判断按键
void khl_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.F7) //F7 设置坐标点
{
string action = string.Empty;
if (rbtnLeftClick.Checked) action = rbtnLeftClick.Text; //左单击
else if (rbtnLeftDoubleClick.Checked) action = rbtnLeftDoubleClick.Text; //左双击
else if (rbtnRightClick.Checked) action = rbtnRightClick.Text; //右单击
else if (rbtnRightDoubleClick.Checked) action = rbtnRightDoubleClick.Text; //右双击
listBox1.Items.Add(string.Format("{0}|{1}|{2}|{3}", txtX.Text, txtY.Text, action, txtSleep.Text.Trim()));
}
else if (e.KeyCode == Keys.F8) //F8 开始
{
if (listBox1.Items.Count == 0) return;
AutoClickThread.ClickData = listBox1.Items.Cast<string>().ToList();
AutoClickThread.Start(IsRecycleRun.Checked);
}
else if (e.KeyCode == Keys.F9) //F9 停止
{
AutoClickThread.Stop();
}
}
另外在操作上为了不必每次都设置一遍鼠标命令,添加了读写配置到文本文件的功能。当焦点在左栏上时,Ctrl+S(这里可能要时间按长一点点)可保存配置,双击左栏可选择并打开一个配置。
鼠标自动点击命令的执行线程,依次加载执行配置好的鼠标命令,代码如下:
//执行
static void Run(object isRecycleRun)
{
string[] stringArray;
int x, y, sleepTime;
do
{
foreach (string item in ClickData)
{
if (cts.Token.IsCancellationRequested) return;
stringArray = item.Split('|');
x = int.Parse(stringArray[0]);
y = int.Parse(stringArray[1]);
sleepTime = int.Parse(stringArray[3]);
switch (stringArray[2])
{
case "左单击": MouseHelper.LeftButtonClick(x, y); break;
case "左双击": MouseHelper.LeftButtonDoubleClick(x, y); break;
case "右单击": MouseHelper.RightButtonClick(x, y); break;
case "右双击": MouseHelper.RightButtonDoubleClick(x, y); break;
}
Thread.Sleep(sleepTime);
}
}
while ((bool)isRecycleRun);
}
其中MouseHelper是对windows api 中鼠标消息进行了简单的封装,可用来模拟鼠标的单双击。