当前位置:   article > 正文

我的外挂之路【一】按键精灵_按键精灵 写外挂

按键精灵 写外挂

系列文章目录


我的外挂之路一按键精灵

我的外挂之路二读取内存

我的外挂之路三远程调用


前言

本文记录了在过去一段时间,对制作外挂的研发经历,从利用按键精灵模拟键盘鼠标到读取内存远程调call的开发之路,留以纪念那些逝去的青春…


正文开始

本篇记录了使用按键精灵取色,判断,模拟按键等常见脚本操作

1.怀恋老飞

飞飞,这是一款年代久远十分经典的打怪升级且可以飞行的游戏,上初中的时候特别喜欢这款游戏,记得那时候每天下了早自习就飞奔到网吧,叫醒睡梦中的网管,开1块钱时间,那时候上网是1块钱50分钟,刚好来得及赶上上课,后来变成1块钱40分钟,在后面2块一个小时,也算见证了网吧的发展史,上线后骑着我的滑板到处飞,看到守护就++++++++,哈哈哈,无忧无虑的时光过得总是很快,可惜后来游戏停服了,偶然不知道从什么地方看到熟悉的游戏,仔细一看原来是私服,怀着激动的心情,下载了游戏…
在这里插入图片描述

2.自动加血

游戏的玩法很简单,双击一个怪,角色就会一直持续攻击怪物,怪物受到攻击也会攻击玩家,玩家需要使用物品栏上的物品保证自己生命值,因此我们需要盯着血条,及时按下f1-f10使用对应的物品以免阵亡,玩了一段时候后,觉得太机械了,我在想能不能有什么东西可以帮我自动去按按键去加血呢?

2.1模拟按键

首先想到按键精灵,简单粗暴,用来模拟按键实在太好用了,打开按键精灵界面,想一想我需要按键精灵每隔一段时间,就帮我按下F1,于是就有了下面这段代码
在这里插入图片描述

While 1

KeyPress "F1", 1
Delay 1000

Wend
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

运行起来,脚本就能以每秒1次的频率自动帮我们加血,使用了一会儿,感觉还是不妥,主要有问题有:

  • 无论打不打挂一直都在吃血,浪费物品
  • 刚吃了一个暴击马上要死了,可是还要等1秒才会加血

于是想想如果能知道我的血减少了,才去吃血就好了

2.2屏幕取色

翻了翻按键精灵,发现有个屏幕取色功能,于是就有了以下的想法,在角色血条一半的地方获取的颜色,如果是红色,说明有血,如果是白色说明要去加血:
在这里插入图片描述

于是就有了以下代码
在这里插入图片描述

While 1

// 获取某个点的颜色
GetColor = GetPixelColor(10, 5)
// 在控制台输出颜色
TracePrint GetColor

// 判断颜色 如果这个点的颜色 不是红色,加血
IfColor 10, 5, "61839B", 1 Then
	
	// 按键键盘
	KeyPress "F1", 1
	
End If

// 每一秒循环一次
Delay 1000

Wend
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

这一次果然比之前好了很多,没血了就才会去加血,但是依然还是存在一些问题:

  • 当窗口位置发生改变时,则获取颜色点就不准了,导致判断出现问题
  • 当窗口处于非焦点情况时,按键会按到别的程序上去

2.3获取窗口位置

又翻了翻按键精灵的命令库,发现对按键精灵窗口支持也挺好,于是就想,可以先获取一下窗口的坐标,因为血条的坐标是相对窗口固定的,那么只要得到了窗口的坐标就也能得到血条的坐标了,这样就解决了窗口位置改变时,获取血条点不准的问题了,顺便还发现了激活窗口的方法,这样在按键执行前,先激活一下窗口,在执行按键也能正常了


// 查找窗口类名(0)或者标题("无标题 - 记事本"),返回找到的句柄Hwnd
Hwnd = Plugin.Window.Find(0, "Flyff")

// 得到窗口句柄的边框大小(包括标题栏)
Rect = Plugin.Window.GetWindowRect(Hwnd)

// 分割字符串
RectArray = Split(Rect, "|")

// 得到窗口位置  然后偏移到我们的血条坐标
x = CInt(RectArray(0)) + 10
y = CInt(RectArray(1)) + 5

While 1

// 获取某个点的颜色
GetColor = GetPixelColor(x, y)
// 在控制台输出颜色
TracePrint GetColor

// 判断颜色 如果这个点的颜色 不是红色,加血
IfColor x, y, "61839B", 1 Then
	
	// 先激活窗口
	Call Plugin.Window.Active(Hwnd)
	// 在按下按键
	KeyPress "F1", 1
	
End If

// 每一秒循环一次
Delay 1000

Wend
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

再次运行,脚本这次更好用了,只要启动程序就能准确的帮助我们去吃血,似乎挺智能的,但随着等级的提升,怪物攻击力越来越高,新的问题来了:

  • 始终取的50%血量的血值,常常我血量濒临50%却不吃血,然后怪物一个暴击,把我直接带走
  • 随着血量的提升,我必须一直使用很高级的血药一次补满50%才不容死,也是很浪费资源,如果能掉20%血就吃小血药,掉60%血吃大血就更好了

2.4 多点取色

其实很容易就想到,可以采用多点取色的方式来解决上面两个问题,但按键精灵的代码不想写了,因为我想用更高级的方法来解决,如果能知道我掉了多少血(具体的数值),然后根据自己的掉血值,来精确选择正确的加血方案就更好了…未完待续

总结

以上就是本篇博客讲述的内容了,本文仅仅简单介绍了按键精灵的使用,而按键精灵提供了大量内库函数,能使我们快速高效解决一些需要模拟鼠标或键盘的重复机械操作!

回顾本文中按键精灵的一些的知识点

  • 模拟F1按钮按下 KeyPress "F1", 1
  • 延时1秒 Delay 1000
  • 获取屏幕上某个点的颜色值 GetPixelColor(2,2)
  • 比较屏幕上某个点的颜色值 IfColor 2,2 'ffffff' 0 then 0=颜色值相等 1= 颜色值不同
  • 根据窗口名获取窗口句柄 Hwnd = Plugin.Window.Find(0, "Flyff")
  • 根据窗口句柄获取窗口大小和位置 Rect = Plugin.Window.GetWindowRect(Hwnd)
  • 控制台输出 TracePrint args
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号