前言
我们的鼠标在进入最近十年后,迅速的发展,鼠标性能的提高,方案的多样化,使得鼠标在完成本身功能的前提下,能提供更多的按键和自定义的功能。
你如果是FPS玩家一定是听说过有一种东西叫做宏,它如同外挂软件一样可以让AK和M4一样稳定,那么宏是不是外挂,宏实现的远离,我们如果要编写宏要怎么操作?这次,我就来说一说宏是什么,它怎么实现的,它又是怎么用的。
什么是宏
宏是什么,目前来说大家说的宏(Macro),其实就算是一种脚本以及执行器,百度百科的说法是,计算机科学里的宏是一种抽象,它根据一系列预定义的规则替换一定的文本模式,那么这句话是什么意思呢?大致就是说,比如今天我定义UP+4这一段话是鼠标向上移动4个像素,那么我在一个文档里面写这句话,程序读取文档中这句就会让鼠标向上移动4个像素点
这会儿写的这个文本就是脚本(Script),这里的脚本就是宏(Macro)了,他们的意思是一样的,就像菠萝和凤梨(闽南话读菠萝的发音)
宏是怎么实现的
宏的实现离不开软件的支持,鼠标驱动实际上是符合USB协议的,像是鼠标键盘摇杆等HID设备在如今和以前的USB下是免驱的,而控制软件可以通过鼠标键盘配合驱动程序,实现我们需要的各类功能
刚刚有说,鼠标键盘的宏的实现,无非就是软件而已,控制软件可以通过间接调用驱动程序达到目的,比如上一段中说的让指针移动4个像素,因为设备性能的提升,我们可以让鼠标去执行脚本,脚本也可保存到鼠标上,毕竟现在鼠标的存储空间存这些字符还是很容易的。
当然,也可能有编译或者文字压缩,类似伪代码那样。
总的来说我个人是觉得有几种形式,一种,控制软件本身和驱动程序挂钩,另一种,控制软件本身只和鼠标通信,鼠标代为执行并通过驱动软件实现。
真正的鼠标宏什么样
鼠标宏,其实长得就像是程序代码那样,不过它是伪代码是脚本,比如罗技全线G系列,控制软件就支持Lua脚本,这是一种非常经常在RPG等游戏中使用到的脚本语言
我从网上找一个罗技鼠标的压枪宏,用作本次实例,因为使用XML格式,所以我们可以简单的打开,图上这一部分主要是鼠标的配置文件
向下拖动,则会看到脚本的部分,密密麻麻的并不容易查看,因为这部分是交由控制软件读取所以就没有前面部分有依有据的样子
总的来说,罗技的配置文件在我看来是以三部分组成,按键名称定义,鼠标配置c包括各档位的DPi,灯的亮度颜色,型号,然后才是脚本
如何写鼠标宏
鼠标宏,可能很多玩家在被恶心过后,就觉得这东西臭不可闻,不过技术是技术,用在哪里归咎于人,自定义按键最开始的宣传点是MMORPG中所用的,比如WOW中技能释放,可以通过按键记录的方式,一键触发出来,而宏则提供了更高级的形式,释放后角色自动位移,并且因为是驱动层级所以不会被检测为外挂,咳咳。
这边我以G9X设备为例,考虑到软件成熟度,不选用罗技G HUB控制软件,使用早期9.0版本的Logitech 游戏软件。
正常记录宏是这样的,可以实现键盘按键记录,可以完成一系列功能,比如输入密码,比如一键打开浏览器,等等等,这里模式是板载存储模式
如果是用Lua脚本的宏,就可以实现更复杂的功能,也让人觉得”这才是宏”,下面举例一段宏,我也会尽量让所有人理解
function OnEvent(event, arg)
if (event == “PROFILE_ACTIVATED”) then
— profile has been activated
end
end
上面的这一段宏,是在配置文件激活的时候运行,当然这一段什么功能也没有执行,他是空的,你如果要执行什么我们必须要添加一些东西到里面。
我们来认识一下,常用的一些”事情”,在宏文件中是EVENT
G_PRESSED 按下G系列的按键,G系列自定义键在罗技的键盘上有挺多
G_RELEASED G按键释放
M_PRESSED 按下M系列的按键
M_RELEASED M系列按键释放
MOUSE_BUTTON_ PRESSED 按下鼠标按钮
MOUSE_BUTTON_RELEASED 松开鼠标按钮,也就是你手指抬起的时候
现在我们来写一个简单的宏,打开txt文本编辑器,当然我更建议你使用Windows10自带的代码编辑器,把这些复制进去。
function OnEvent(event,arg)
if(event == “MOUSE_BUTTON_PRESSED” and arg == 2) then
OutputLogMessage(“鼠标按键2按下了”);
end
end
然后保存文件,做的非常好,你现在已经掌握了如何写和保存宏了!这可是一大进步
现在,可以打开控制软件,为了开启强大的功能我们必须设置为使用PC端控制软件来实现功能的模式
进入宏编辑界面,新建一个配置文件,因为是实验所以就先只在记事本.exe里面生效
保存后界面如下,我们可以试试把宏导入进去,当然现在还没到时候
在配置文件图标处右键,第七项,编写脚本
弹出如下窗口,可以在这里编辑我们的宏
刚刚不是保存了文本文件吗,复制过来看看吧
Ctrl+S保存宏然后就可以在记事本窗口下实验了,按动鼠标右键,下方会有提示我们设置好的语句。都是问号是正常的因为没有字库,我写的只是为了方便理解
当然到这你应该明白了,事件要再加上arg这个数值才等于指定的按钮,比如鼠标事件+按钮对应的数值,才等于具体是哪个按钮,键盘G按键什么的也是一样的,鼠标左键是1,右键是2,中按键是3,其他鼠标也是,至于自定义按键嘛,这个请自行尝试了
然后我们可以写点激动人心的东西,比如来理解下用鼠标宏要怎么压枪
使用鼠标宏压枪
其实,为了保护操作,左键是不能绑定脚本的,鼠标必须有一个按键必须被设置为左键,在刚刚写脚本的界面你应该也会发现不能让左键被识别。也因此,我们得重新设置一下鼠标
侧面的按键设置一个按钮,作为鼠标的左键
鼠标左键,就随意设置为其他按键了
另外为了方便演示,设置画图也就是mspaint.exe作为宏应用程序,这个软件简直和记事本一样经典,它的位置在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories
再然后,要让左键识别,我们要在脚本触发的时候加上一句
EnablePrimaryMouseButtonEvents(true)
接下来要了解几段话,下面这一段话是在鼠标当前坐标下相对进行移动的,x是横向移动,y就是竖向移动
MoveMouseRelative(x,y)
1,我们可以写一个这样的宏,每次点击鼠标左键就可以让鼠标的坐标向下移动一段距离,下面这一段复制到编辑器里面可以直接看到效果
function OnEvent(event, arg)
if (event == “PROFILE_ACTIVATED”) then
EnablePrimaryMouseButtonEvents(true) –加上这句后,左键也可以随便触发脚本
elseif event == “PROFILE_DEACTIVATED” then
IsOnClick = false
end
if(event == “MOUSE_BUTTON_PRESSED” and arg == 1) then
MoveMouseRelative(0, 4) –每次点击左键向下移动4单位
end
end
2,扩展一下,按住鼠标左键的时候,坐标会自动向下,松开左键的时候,停止,这样一个简单的压枪宏就完成了
function OnEvent(event, arg)
if (event == “PROFILE_ACTIVATED”) then
EnablePrimaryMouseButtonEvents(true)
elseif event == “PROFILE_DEACTIVATED” then
IsOnClick = false –这是记录按键按下了没有的,一开始是没有
end
if(event == “MOUSE_BUTTON_PRESSED” and arg == 1) then
IsOnClick = not IsOnClick –按下的时候,翻转一下,false变true
AK() –这是压枪的函数
end
if (event == “MOUSE_BUTTON_RELEASED” and arg == 1) then
IsOnClick = false
OutputLogMessage(“Release”)
end
end
function AK()
repeat
if (IsMouseButtonPressed(1)) then –如果鼠标左键按下了,就执行向下移动2.5个位置的语句
MoveMouseRelative(0, 2.5)
Sleep(30)
end
until(not IsOnClick) –按键没按下,退出
end
随便加的图
3,再扩展一下,随着按下时间的变化,移动坐标的幅度也变化,我想你们也不会去看,直接复制然后试试就行了
function OnEvent(event, arg)
if (event == “PROFILE_ACTIVATED”) then
EnablePrimaryMouseButtonEvents(true)
elseif event == “PROFILE_DEACTIVATED” then
IsOnClick = false
end
if(event == “MOUSE_BUTTON_PRESSED” and arg == 1) then
IsOnClick = not IsOnClick –用于记录鼠标按下
AK()
end
if (event == “MOUSE_BUTTON_RELEASED” and arg == 1) then
IsOnClick = false –松开按键的时候,让向下移动的宏失效
OutputLogMessage(“Release”)
end
end
function AK()
ShotTime = 0 –这里是左键一直按着的时间
repeat
if (IsMouseButtonPressed(1)) then
if ShotTime <480 then –时间小于480个单位的时候,向下移动2.5个位置
MoveMouseRelative(0, 2.5)
elseif ShotTime < 2400 then –如果大于480单位,但是小于2400单位的时候,移动4.5个位置,增大幅度
MoveMouseRelative(0, 4.5)
else –其他时候,比如时间大于2400单位就移动5.5个位置
MoveMouseRelative(0, 5.5)
end
end
ShotTime = ShotTime + 30
Sleep(30)
until(not IsOnClick)
end
如果要开关,也就是说,有时候要用有时候不要用压枪宏,那我们就设置一个侧面的按键用于解决这个问题,它就用来启用或者禁用宏
function OnEvent(event, arg)
if (event == “PROFILE_ACTIVATED”) then
EnablePrimaryMouseButtonEvents(true)
MacroState = false –用于开关压枪宏
elseif event == “PROFILE_DEACTIVATED” then
IsOnClick = false
end
if(event == “MOUSE_BUTTON_PRESSED” and arg == 1) then
IsOnClick = not IsOnClick –用于记录鼠标按下
AK()
end
if (event == “MOUSE_BUTTON_RELEASED” and arg == 1) then
IsOnClick = false –松开按键的时候,让向下移动的宏失效
end
if (event == “MOUSE_BUTTON_PRESSED” and arg == 5) then
–当你按下侧边按键时候,切换宏启用的开关,从而控制压枪的启动的停用
if not MacroState then
OutputLogMessage(“Switch Macro On”)
MacroState = not MacroState
else
OutputLogMessage(“Switch Macro Off”)
MacroState = not MacroState
end
end
end
function AK()
ShotTime = 0 –这里是左键一直按着的时间
repeat
if (IsMouseButtonPressed(1) and MacroState) then –如果按键按下了,并且压枪宏开关是开的时候则执行
if ShotTime <480 then –时间小于480个单位的时候,向下移动2.5个位置
MoveMouseRelative(0, 2.5)
elseif ShotTime < 2400 then –如果大于480单位,但是小于2400单位的时候,移动4.5个位置,增大幅度
MoveMouseRelative(0, 4.5)
else –其他时候,比如时间大于2400单位就移动5.5个位置
MoveMouseRelative(0, 5.5)
end
end
ShotTime = ShotTime + 30 –左键按下的持续时间在这变化,这要依据暂停时间进行修改
Sleep(30)
until(not IsOnClick) –鼠标已经抬起了,退出
end
如何切换枪械,对应不同的枪?这个融会贯通一下就行了吧,我就不写了
总结
罗技宏用的是Lua脚本,本身编写难度和可读性我个人是觉得还不错,当然了,如果你从未接触过代码和脚本,那是有很大难度的,至少从第一句开始就会头疼,这很正常,如果你看了后理解了,那恭喜你,你在我的想法中应该是属于2%的人群,是的,我觉得能看懂的只有2%
可能你到这里还有一些疑问,比如这里的这种宏是不是外挂,宏当然是外挂,宏本来就属于在执行外部程序,当然这比那些纯软件的比如D3D覆盖UI绘制透视框的,还有读取内存地址的非内存挂来说,可能更高级一点,它一定程度来说是硬件外挂,是通过驱动程序执行的。
感谢观看