让鼠标自己动的脚本
作者:五月雨雪
前言
我以前写过类似功能的脚本,可以使一个键发挥多个键的功能,但是代码较为琐碎,拓展功能时较为麻烦,所以这次趁着有空重新整理一下,分享给有需要的朋友。
效果
![](https://p0.ssl.img.360kuai.com/t01056c10676873007e.jpg)
相信很多朋友都玩过moba类的游戏,这类游戏中大部分都集成有快速发信号的功能,即按下一个预设键后不要松开,拖动鼠标到四个不同的方向就可以发送四种对应的信号,比如援助、坚守、危险等。这种转盘形式的信号系统简单直观,熟悉之后下意识即可完成操作,而这也正是本篇文章中脚本的灵感来源。
启用脚本后按下预设键位不要松开,此时保持不动、向上、向下、向左或向右移动鼠标后松开预设键即可触发五种不同的功能。搭配ctrl
或ctrl
+alt
可以再分别拓展五种功能,总计15种不同的功能。理论上配合各种修饰键的组合可以实现更多的功能,但是我个人认为没有必要,一是记不住,二是可能产生键位冲突。
实现
编辑键位
确保自己的鼠标上有至少一个不用的按键,在对应的配置中将该键位禁用。此处也可以不禁用,但是后续在修改脚本模板时需要将鼠标原地不动对应的功能留空。
修改脚本
首先给出一个脚本模板:
-- 转盘移动方向判定的最小鼠标位移\nlocal TURNTABLE_MIN_DISTANCE = 20\n-- 修饰键状态查询时间间隔\nlocal TURNTABLE_MODIFIER_HEARTBEAT = 10\n-- 转盘两次触发最小时间间隔\nlocal TURNTABLE_MIN_INTERVAL = 50\n\nlocal turntableLastTriggerTime = GetRunningTime()\n\nlocal funcs = {\n function()\n OutputLogMessage("test")\n end,\n "test",\n function()\n OutputLogMessage("test")\n end,\n}\nfuncs[6] = "test2"\nfuncs[15] = "test3"\n\nEnablePrimaryMouseButtonEvents(true)\n\nfunction OnEvent(event, arg)\n if (event == "MOUSE_BUTTON_PRESSED" = 7) then\n x1, y1 = GetMousePosition()\n -- OutputLogMessage("Mouse pressed at %d, %dn", x1, y1)\n end\n if (event == "MOUSE_BUTTON_RELEASED" = 7) then\n x2, y2 = GetMousePosition()\n -- OutputLogMessage("Mouse released at %d, %dn", x2, y2)\n Turntable(x1, y1, x2, y2, funcs)\n end\nend\n\nfunction Turntable(x1, y1, x2, y2, funcs)\n -- 核验转盘上次触发时间\n if (GetRunningTime() - turntableLastTriggerTime < TURNTABLE_MIN_INTERVAL) then\n return\n end\n -- 定义局部变量\n local dx, dy, direction, func\n -- 计算鼠标指针位移\n dx = x2 - x1\n dy = y2 - y1\n -- 鼠标移动方向,1-5分别对应原地、上、下、左、右\n direction = 1\n if (math.abs(dx) < math.abs(dy) -TURNTABLE_MIN_DISTANCE) then\n direction = 2\n elseif (math.abs(dx) < math.abs(dy) TURNTABLE_MIN_DISTANCE) then\n direction = 3\n elseif (math.abs(dx) > math.abs(dy) -TURNTABLE_MIN_DISTANCE) then\n direction = 4\n elseif (math.abs(dx) > math.abs(dy) TURNTABLE_MIN_DISTANCE) then\n direction = 5\n end\n -- 根据按住修饰键的不同修改direction的数值,将按键功能由5拓展为15\n if IsModifierPressed("ctrl") direction + 10\n elseif IsModifierPressed("ctrl") then\n direction = direction + 5\n end\n -- 轮询修饰键状态,所有修饰键松开后开始执行对应功能\n while (IsModifierPressed("ctrl") funcs[direction]\n -- OutputLogMessage(direction)\n if (type(func) == "function") then\n func()\n elseif (type(func) == "string") then\n PlayMacro(func)\n end\n -- 更新上次触发时间\n turntableLastTriggerTime = GetRunningTime()\nend\n\n
具体需要修改的部分见下图:
![](https://p0.ssl.img.360kuai.com/t01115e848892b683d4.jpg)
代码解读
本部分内容可以跳过,只是记录一下写代码时的思路和解决方法,对于有兴趣自己编写罗技Lua脚本的朋友可以随便看看。
罗技的G HUB驱动虽然支持Lua脚本,但是这么多年过去了也没啥突破,还是一个半成品,各种问题很多。
首先要吐槽的一点就是字符串不支持中文,所有定义到变量中的字符串都会被识别为“?”,这一点可以通过sting.byte函数来验证。这就直接导致我想要将中文转为unicode编码通过WinCompose软件直接输出到文本编辑器中的计划破灭。虽然罗技驱动中通过编写宏的方式也可以直接输出中文字符,但是这就少了在代码中即时生成字符串的灵活性。而且实测该种方法输出的字符在WPS软件中会出现未知错误,输出的字符串皆为第一个字符的重复。
罗技的脚本是单线程运行的,希望各位在编写脚本时牢记心头。其实之前看到过一篇文章,该作者自己写了一个包实现了并行的效果,但我没仔细研究,一是懒,二是觉得真没必要,写个鼠标脚本不必如此深入。单线程带来的最大问题就是Sleep函数以及while循环要慎用。以我上面的代码为例,我为了防止按下修饰键对转盘功能的影响,将功能响应放在了松开所有修饰键后。这样设计主要是考虑到如下场景:将按下ctrl
并按住转盘键向上滑动的功能设置为按一下S
,如果没有上面的设计,就会变为ctrl
+S
这一保存的快捷键。这样设计的初衷是好的,但是会带来一个问题,那就是如果我在按住ctrl
后多次按下转盘键,就会因为代码中轮询修饰键状态而使所有的按键事件卡在一起结算。换个说法,第一次转盘键松开后进入while循环,之后的每次按键都会等待该while循环结束后再依次执行,表现出来的效果就是只有第一次按键执行了正确的功能,后面的每一次按键功能都会变为funcs[1]。为了解决这一弊端,我不得不又引入了执行间隔,也就是转盘键在触发一次后必须等待固定时间间隔后才能再次触发。上面两个操作会带来一个弊端,就是按下修饰键后无法在不松开修饰键的情况下触发多个不同的功能,不过为了兼容性我觉得这点代价还是可以接受的。如果没有键位冲突的顾虑可以自行将模板中对应的两部分代码删除。
应用
游戏发言
仅需一个键就可以在游戏中实现快速喷人沟通的所有语句。玩外服时可以将一些类似good try、we can win、have fun的短句绑定在转盘键上,瞬间化身社交达人,带领团队走向胜利。
文档编辑
类似ctrl
+C
、ctrl
+V
、ctrl
+A
、ctrl
+Z
等常用快捷键。
后记
本篇文章并不是针对一无所知的小白编写的,所有只是简单写了下关键步骤,如果看不太懂的话可以先看看我前两篇文章,里面配图多一些,可能好懂一点。实在看不明白又有强烈使用需求的朋友可以留言或者私信我,如果你的需求很有意思或者使用场景很经典的话,我可能会以你的需求额外写一篇文章。
阅读更多鼠标精彩内容,可前往什么值得买查看
","gnid":"9646d48aabc197f7e","img_data":[{"flag":2,"img":[{"desc":"","height":"512","title":"","url":"https://p0.ssl.img.360kuai.com/t01056c10676873007e.jpg","width":"512"},{"desc":"","height":"755","title":"","url":"https://p0.ssl.img.360kuai.com/t01115e848892b683d4.jpg","width":"600"}]}],"original":0,"pat":"art_src_1,fts0,sts0","powerby":"hbase","pub_time":1689664265000,"pure":"","rawurl":"http://zm.news.so.com/fb62036638323307d7a6823ad1670c8c","redirect":0,"rptid":"19d5c5ee5802d4e4","rss_ext":[],"s":"t","src":"什么值得买","tag":[{"clk":"kdigital_1:罗技","k":"罗技","u":""}],"title":"罗技鼠标lua脚本 篇二:罗技鼠标lua脚本-以转盘形式拓展单键实现15个功能
邬燕韩4689大家好,我想用按键精灵做一个脚本, 就是录制一个鼠标动作,先找一张图,找到这张图之后自动鼠标自动点 -
冀钞悦13463916409 ______ FindPic 0,0,1366,1366,"Attachment:\123.bmp",0.9,intX,intY//先用抓抓截图保存那张图的名字,123.bmp If intX > 0 And intY > 0 Then Delay 50 LeftClick 1 End If //请采纳,谢谢
邬燕韩4689请教高手按键精灵如何设置,情况如下: 我玩游戏想让鼠标自动点屏幕上的刷新和死斗做一个循环脚本?跪求! -
冀钞悦13463916409 ______ 这个简单,打开按键精灵,新建,然后看左边的,插入鼠标移动到你的刷新位置,判断位置可以点击上面的抓点抓色,然后一下中间能看到坐标的,更改你的鼠标移动位置到该坐标,然后点击插入鼠标单击,然后插入其他命令里面的延迟多少秒,1000毫秒就是1秒,时间你自己确定吧 然后插入鼠标移动到死斗的坐标,插入鼠标点击,然后延迟多少秒,等等,保存退出 启用这个脚本就行了,多试试就明白了
邬燕韩4689按键精灵键盘模拟鼠标动作脚本 -
冀钞悦13463916409 ______ 上:MoveTo 683, 384 LeftDown 1 Delay 20 MoveTo 683, 384-20 LeftUp 1 下:MoveTo 683, 384 LeftDown 1 Delay 20 MoveTo 683, 384+20 LeftUp 1 左:MoveTo 683, 384 LeftDown 1 Delay 20 MoveTo 683-20, 384 LeftUp 1 右:...
邬燕韩4689我想制作一个鼠标的按建精灵脚本. -
冀钞悦13463916409 ______ 按键精灵点击录制,做一遍你需要做的动作,然后结束.保存就能用了.如果要重复运行,把“是否阻止脚本重复运行”选否,重复次数选为按终止键为止
邬燕韩4689我想做一个按键精灵鼠标脚本,能自动移动到固定坐标单击左键,而使游戏人物不走动的,谁可以教我怎么做. -
冀钞悦13463916409 ______ 先抓点抓色 的到那个坐标 然后moveto x,yLeftClick 1 人物不动什么意思
邬燕韩4689求按键精灵脚本大神指点~! 怎么编辑能让鼠标 自己来回的在回合制游戏中来回走动~!从而能自己遇怪~!详细点~! -
冀钞悦13463916409 ______ 你这问题太庞大了,不同的游戏可能你的应对策略都是不同的,如果你的wg只是前台操作,你可以用MoveTo x坐标,y坐标,注意这个x,y是屏幕坐标,不是游戏窗口的.如果要想转换成窗口坐标,和用句柄取得当前窗口位置,也就是说窗口的到...
邬燕韩4689按键精灵后台鼠标移动和点击脚本怎么制作 -
冀钞悦13463916409 ______ 先获取要后台操作的窗口句柄,然后调用后台命令进行点击.参考以下代码:Hwnd = Plugin.Window.Find(0, "无标题 - 记事本") Call Plugin.Bkgnd.LeftClick(Hwnd, 100, 200)
邬燕韩4689按键精灵怎么写 一个弹出下面的图片,就会自动点的脚本 -
冀钞悦13463916409 ______ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 //-----------------查找图片,找2113到5261后点击4102-------------------------------- do FindPic 400,840,830,920,"D:\找图\图片.bmp",1,intX,intY IfintX > 0 AndintY > 0 Then MoveTo intX+25, intY+13 Delay 200 ...
邬燕韩4689按键精灵设置鼠标移动脚本 -
冀钞悦13463916409 ______ Dim i,n Dim x(2),y(2) i=0 n=0 VBSCall GetCursorPos(x(i),y(i)) While i<2 //设置延时,2分钟内5次 Delay 120000/5 //这里用绝对值函数,使i在0与1之间互相转化 i=Abs(i-1) VBSCall GetCursorPos(x(i),y(i)) If x(0)=x(1) and y(0)=y(1) n=n+1 Else n=0 ...
邬燕韩4689如何编一个脚本,让鼠标循环的每隔15分钟在843,171上完成一次点击,谢谢! -
冀钞悦13463916409 ______ 按键精灵的:While 1 MoveTo 843 171 LeftClick 1 Delay 15*60*1000 EndWhile