羽夏闲谈——鼠标连点器
前言
玩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,再加可以自定义的设置代码,一个连点器就彻底完成了。
本文来自博客园,作者:寂静的羽夏,一个热爱计算机技术的菜鸟,转载请注明原文链接:https://www.cnblogs.com/wingsummer/p/15388941.html
原文地址:https://www.cnblogs.com/wingsummer/p/15388941.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 安防视频监控系统视频上云解决方案EasyCVR集成海康EHome私有协议系列:设备录像流数据进行PS包分割
- Java 语言基础 (常用类的概述和使用, String 类的概述和使用, 可变字符串类和日期相关类, 集合类库)
- 盘一盘 Python 特别篇 22 - 分箱之 cut
- 数据结构基础 (代码效率优化, 线性表, 栈, 队列, 数组,字符串,树和二叉树,哈希表)
- Python爬虫之requests模块了解
- Python爬虫之数据提取概述
- Python爬虫之数据提取-jsonpath模块
- 什么是高斯混合模型
- Python爬虫之数据提取-lxml模块
- 用Python读写文件的方法
- 反编译PyInstaller打包后的exe为py源码
- Qt多线程编程实战:MD5单项加密
- 高速上云/网络穿透/视频上云网关EasyNTS组网服务平台如何通过复制穿透结果实现外网到内网的访问?
- SpringBoot常用注解的简单理解
- Qt多线程编程之线程的同步和互斥