欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

开发一个自动点击工具

程序员文章站 2024-03-04 09:07:11
...

一个人点鼠标总是很麻烦,尤其是这个时间很长的时候。所有就考虑要做一个模拟鼠标点击的工具。

1.准备

打开vs,新建一个窗口程序。
开发一个自动点击工具
上面依次选择,
1.程序的类型:窗口程序
2.新程序的名字和命名空间
3.项目的位置。

然后就自动生成了一个窗体应用。

2.界面设计

开发一个自动点击工具
类似上面的这个样子。一个输入框用来控制频率,一个按钮用来确认频率(ps:可以在输入框的离开事件中直接确认)
然后再从控件库加入一个小小的定时器。定时器的名字是Timer。

3.热键注册

首先全局注册一个热键来控制自动点击的开始与结束。

引用系统dll的方法

[DllImport("user32.dll", SetLastError = true)]
public static extern bool RegisterHotKey(
     IntPtr hWnd,                //要定义热键的窗口的句柄
     int id,                     //定义热键ID(不能与其它ID重复)           
     KeyModifiers fsModifiers,   //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
     Keys vk                     //定义热键的内容
     );
 [DllImport("user32.dll", SetLastError = true)]
 public static extern bool UnregisterHotKey(
    IntPtr hWnd,                //要取消热键的窗口的句柄
    int id                      //要取消热键的ID
    );
 //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
 [Flags()]
 public enum KeyModifiers
 {
     None = 0,
     Alt = 1,
     Ctrl = 2,
     Shift = 4,
     WindowsKey = 8
 } 

心急小伙伴直接复制即可。
两个方法,第一个是注册热键,第二个是注销热键。一定要注销,不然热键会一直存在的。

在窗体中注册和注销

private void Form1_Load(object sender, EventArgs e)
{
     MouseDLL.RegisterHotKey(Handle, 100, MouseDLL.KeyModifiers.None, Keys.F1);
 }

 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
 {
     MouseDLL.UnregisterHotKey(Handle, 100);
 }

 protected override void WndProc(ref Message m)
 {
     const int WM_HOTKEY = 0x0312;
     if (m.Msg == WM_HOTKEY && m.WParam.ToInt32() == 100)
     {
         timer1.Enabled = !timer1.Enabled;
     }

     base.WndProc(ref m);
 }

方法一,窗体的进入事件,此时注册热键。热键id是随便选的。
方法二,窗体的结束事件,此时注销热键。
方法三,重载窗体的消息通知,判断是否有按键按下。如果按下就打开定时器的开关。
提示,多线程不支持鼠标模拟。

4.模拟鼠标

最后就是重点了。模拟鼠标的按下效果。
这里有一个重点,鼠标的位置默认是从当前鼠标位置开始计算的,如果要自定义位置,最好是使用绝对坐标。

引用系统dll

const int MOUSEEVENTF_MOVE = 0x0001; //移动鼠标
const int MOUSEEVENTF_LEFTDOWN = 0x0002; //模拟鼠标左键按下
const int MOUSEEVENTF_LEFTUP = 0x0004; //模拟鼠标左键抬起
const int MOUSEEVENTF_RIGHTDOWN = 0x0008; //模拟鼠标右键按下
const int MOUSEEVENTF_RIGHTUP = 0x0010; //模拟鼠标右键抬起
const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; //模拟鼠标中键按下
const int MOUSEEVENTF_MIDDLEUP = 0x0040; //模拟鼠标中键抬起
const int MOUSEEVENTF_ABSOLUTE = 0x8000; //标示是否采用绝对坐标
/// <summary>
/// 鼠标事件
/// </summary>
/// <param name="dwFlags"></param>
/// <param name="dx"></param>
/// <param name="dy"></param>
/// <param name="cButtons"></param>
/// <param name="dwExtraInfo"></param>
/// <returns></returns>
[DllImport("user32.dll", SetLastError = true)]
private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

下面写一个鼠标左键的例子。

/// <summary>
/// 左键单击
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public static void mouse_click(int x = 0, int y = 0)
{
    mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
    mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);
}

提示:里面的参数是可以合并的。比如

mouse_event(MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_LEFTUP, x, y, 0, 0);

最后的最后,把模拟左键的方法写在定时器里。同时设置定时器的频率。

private void timer1_Tick(object sender, EventArgs e)
{
    MouseDLL.mouse_click();
 }

 private void button1_Click(object sender, EventArgs e)
 {
     var tt = textBox1.Text;
     int timer = timer1.Interval;
     if (int.TryParse(tt, out timer))
     {
         timer1.Interval = timer;
     }
 }

好了,现在只要运行这个程序就能够监听F1键,在按下F1键之后疯狂的点击鼠标左键。如果再次按下F1键,模拟点击就会停止了。

相关标签: 鼠标