wingsummer 阅读(20) 评论(0)

前言

  玩95版植物大战僵尸的打僵尸游戏被打自闭了,到了进度中间僵尸出的速度就离谱,打都打不完,手和鼠标都要点费了。我堂堂一个会编程的人,想通过这个关卡,于是乎写一个鼠标连点器的念头就起来了。

就这么离谱

原理

  何为鼠标连点器,顾名思义,通过某种方式实现快速在某个位置连续点击。本次我们将用C语言来实现一个简陋的鼠标连点器。为啥说简陋呢?一是不好看,是一个黑框控制台;二是不能随便自定义设置,需要改代码。但鼠标连点器的精髓都在于此。
  既然实现鼠标连点器的功能,我们就必须找到能够模拟出鼠标点击的API。经过查询,找到如下库函数:

WINUSERAPI VOID WINAPI mouse_event(
	DWORD dwFlags,
	DWORD dx,
	DWORD dy,
	DWORD dwData,
	ULONG_PTR dwExtraInfo);

  这个函数的功能是用于鼠标的移动和点击。从函数的名称就知道这东西是干啥的,发起一个鼠标事件,鼠标不就能干点击、滚轮滚动、移动光标的事情吗?我们需要点击鼠标几下,调用这个函数几次不就行了吗?实现模拟点击调用如下:

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); //当前位置点击一次鼠标

  我比较懒,我想点击键盘的某一个按键就在我鼠标的位置持续要知道这个按键的状态,就需要下面这个API

WINUSERAPI SHORT WINAPI GetAsyncKeyState(int vKey);

  如果我想检测Control这个按键的状态,我们需要这样调用:

GetAsyncKeyState(VK_CONTROL);

  VK_CONTROL是一个枚举,它的值代表一个按键,其他的按键自行查看。
  所有需要的函数都了解了,我们就开始写代码了。

#include <windows.h>    //GetAsyncKeyState 和 mouse_event 两个函数需要引用的头文件

int main()
{
    //轮巡按键状态
    while (1)
    {
        //CONTROL键是否被按下,是的话进入连点循环
        while (GetAsyncKeyState(VK_CONTROL))
        {
            mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
            Sleep(5);    //更改参数可以调整连点频率
        }
        //ESCAPE键被按下的话,直接退出循环结束
        if (GetAsyncKeyState(VK_ESCAPE))
            break;
        Sleep(10);    //更改此参数可以调整轮巡按键频率
    }
    return 0;
}

  上面的代码还调用了Sleep函数,这个函数是用来暂停当前线程的。故名思意就是先睡一会不操作。睡到指定时间再醒过来继续执行。传递的参数是时间,单位是毫秒。通过这个可以调整频率,减少CPU负担。

测试

  让那些僵尸们感受到恐惧吧!!!

结语

  本人火绒粉,从论坛看到 点击器传播病毒暗刷流量 ,有些感慨。就这一个小功能就被下毒,有点感慨很多软件越来越流氓,IT现在的软件环境比较良心的少了。
  说点题外话,软件免费功能强大,投放广告你投也就罢了,能不能投点正常的广告?有些软件原本良心,现在动不动就公开下毒,搜集信息或暗刷流量或劫持等等有意思吗?哪些软件我就不说了,随便就一大堆。
  好了,不说了。现在做一个小总结:通过GetAsyncKeyState获取指定按键状态确定开始连点,用mouse_event实现模拟点击,连点器的功能就完全实现了。加一个 GUI,再加可以自定义的设置代码,一个连点器就彻底完成了。