因为玩游戏(XX水族馆)的原因,需要频繁点击鼠标,所以想找个软件的动作来替代鼠标动作。在网上找了好多鼠标自动点击器,不是要收费就是程序根本就是个bug。所以决定干脆自己做一个好了。。。原理也不难,涉及到的知识也很简单。。我相信这是一篇不错的启蒙导读。毕竟我也是个新手。。
下载地址:http://download.youkuaiyun.com/detail/skygpan/3881900
小技术:API函数应用,hotkey热键注册,最小化隐藏窗体
指导思想:越简单越好
一、首先是设计界面,
1.有个启动/关闭按钮。
2.有个热键说明。
3.有个模拟鼠标的动作的选择。
4.有个时间间隔的输入
5.标题栏:窗体上不需要最大化按钮,最小化按钮是自动隐藏,再有个叉子退出按钮
以上这些差不多了。。实用为主
好了,在VS中设计一下界面,大概就是这样了,可以自己选择自己喜欢的位置
二、设计类
1.一套windows的API,这个通常我都是在网上找,资源很丰富。
包含:鼠标API,热键API
正所谓,一个男人应该有一套属于自己的API! 还有很多API自己去攒吧~
a.鼠标操作API
public static extern void mouse_event(int flags, int dx, int dy, uint data, UIntPtr extraInfo);
public enum MouseButton : uint
{
Left = 0x2,
Right = 0x8,
Middle = 0x20
}
封装鼠标操作类:
class MouseUtility
{
public static int intervalTime = 1;
public static void MouseDown(WinAPI.MouseButton mouse);
public static void MouseUp(WinAPI.MouseButton mouse);
public static void Click(WinAPI.MouseButton button);
public static void DoubleClick(WinAPI.MouseButton button);
}
b.热键操作API
[DllImport("user32.dll", SetLastError = true)]
public static extern bool RegisterHotKey(
IntPtr hWnd, // handle to window
int id, // hot key identifier
int fsModifiers, // key-modifier options
int vk // virtual-key code
);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool UnregisterHotKey(
IntPtr hWnd, // handle to window
int id // hot key identifier
);
public enum MyKeyValue : uint
{
MOD_ALT = 0x0001,
MOD_CONTROL = 0x0002,
MOD_SHIFT = 0x0004,
MOD_WIN = 0x0008,
}
2.业务逻辑代码主要程序模块:
1.初始化
a.绑定热键,方便用户随时调用
WinAPI.RegisterHotKey(this.Handle, this.hotKeyIDRun, 0, (int)Keys.F8);
WinAPI.RegisterHotKey(this.Handle, this.hotKeyIDStop, 0, (int)Keys.F9);
b.绑定界面数据
ViewBind()
2.重写WndProc函数
用于捕获window窗体的消息,如果是快捷键,则检查是否是绑定的快捷键。
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WinAPI.WM_HOTKEY:
if (m.WParam.ToInt32().Equals(this.hotKeyIDRun)){RunningClick();}
if (m.WParam.ToInt32().Equals(this.hotKeyIDStop)){StopClick();} break;
}
base.WndProc(ref m);
}
3.应用配置项
应用配置按钮的事件,用于绑定间隔时间和获得操作类型
try
{
double inTime = double.Parse(this.TxbIntervalTime.Text);
if (inTime < 0) ViewUtility.ShowInfo("时间间隔必须是正数!");
this.timer1.Interval = (int)inTime * 1000;
}
catch
{
ViewUtility.ShowInfo("您输入的时间间隔有误,请重新输入!");
return;
}
this.action = (MyAction)this.CbxSelectAction.SelectedValue;
ViewUtility.ShowInfo("配置成功!");
4.开始运行
private void RunningClick()
{
/界面显示
this.BtnRunning.Text = "停止";
this.BtnRunning.BackColor = Color.DarkGray;
this.BtnRunning.ForeColor = Color.White;
this.notifyIcon1.Text = "已启动";
/业务处理
this.timer1.Start();
}
5.间隔执行函数
根据界面的现实,调用封装的鼠标点击操作
private void timer1_Tick(object sender, EventArgs e)
{
switch (action)
{
case MyAction.LeftClick: MouseUtility.Click(WinAPI.MouseButton.Left); break;
case MyAction.RightClick: MouseUtility.Click(WinAPI.MouseButton.Right); break;
case MyAction.LeftDoubleClick: MouseUtility.DoubleClick(WinAPI.MouseButton.Left); break;
case MyAction.RightDoubleClick: MouseUtility.DoubleClick(WinAPI.MouseButton.Right); break;
default: break;
}
}
6.结束运行
private void StopClick()
{
//界面显示
this.BtnRunning.Text = "启动";
this.BtnRunning.BackColor = Color.WhiteSmoke;
this.BtnRunning.ForeColor = Color.Black;
this.notifyIcon1.Text = "已停止";
//业务处理
this.timer1.Stop();
}
7.最小化隐藏函数和显示事件
private void notifyIcon1_DoubleClick(object sender, EventArgs e)
{
if (base.WindowState.Equals(FormWindowState.Minimized))
{
//顺序不能颠倒,否则你会后悔的!
base.Show();
base.WindowState = FormWindowState.Normal;
}
}
private void Form1_Deactivate(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
this.Hide();
}
}
最后来个截图:
基本上,这个简单的程序,就是由以上这些主要代码组成的,零零碎碎的还有一些代码,就不粘贴出来了。
自己用的时候还是很爽的。尤其是在玩水族馆的时候,摆脱了狂点鼠标的烦恼。
这套程序提供给大家完整的源代码和实现方案。有兴趣的朋友可以拿去扩展。