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

系列文章目录


我的外挂之路一按键精灵

我的外挂之路二读取内存

我的外挂之路三远程调用


前言

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


正文开始

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

1.怀恋老飞

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

2.自动加血

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

2.1模拟按键

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

While 1

KeyPress "F1", 1
Delay 1000

Wend

运行起来,脚本就能以每秒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

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

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

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

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

  • 始终取的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
<think>好的,用户的问题是关于按键精灵如何等待进程完全启动后再执行后续操作的方法。我需要根据提供的引用资料来寻找解决方案。首先,引用[2]提到使用FindWindow函数来检测窗口是否存在,这可以用来判断进程是否启动。另外,引用[3]中提到的多普鼠标键盘万能模拟精灵程序可以后台操作指定窗口,这可能涉及等待窗口就绪。引用[4]中的Python调用按键精灵插件可能有相关函数。 用户的需求可能是在脚本中等待某个进程完全加载,比如等待窗口标题出现后再继续执行。可能需要循环检测窗口是否存在,或者使用延迟函数。但需要更具体的实现方法,比如使用FindWindow结合循环判断,或者调用插件中的等待函数。 此外,按键精灵可能有内置的命令或插件来实现等待进程启动,比如WaitForWindow或者类似的函数。需要确认是否有这样的命令,或者是否需要编循环检测的代码。根据引用[2],使用FindWindow可以检测窗口是否存在,所以可以循环调用这个函数直到返回有效句柄,表示进程已启动。同时,可能需要设置超时机制,避免无限等待。 总结可能的解决方案:使用FindWindow检测窗口标题,循环检查直到窗口存在,或者使用插件提供的等待函数。可能需要结合延迟命令,如Delay,来控制检测频率。同时,要确保窗口标题准确,避免检测错误。</think>在按键精灵中实现等待进程加载完成后再执行后续操作,可以通过以下两种方法实现: ### 方法:窗口标题检测法(推荐) ```vbscript // 设置最大等待时间(单位:毫秒) maxWait = 10000 startTime = Plugin.Sys.GetTime() // 循环检测窗口是否存在 Do // 使用FindWindow函数检测窗口[^2] hwnd = Plugin.Window.Find(vbNullString, "目标窗口标题") If hwnd <> 0 Then Exit Do // 设置检测间隔 Delay 500 // 超时判断 If Plugin.Sys.GetTime() - startTime > maxWait Then MessageBox "等待超时" Exit Script End If Loop ``` ### 方法二:进程PID检测法(需插件支持) ```vbscript // 调用插件获取进程ID PID = Plugin.Process.GetPID("目标进程名.exe") // 等待进程初始化完成 While PID = 0 Delay 1000 PID = Plugin.Process.GetPID("目标进程名.exe") Wend ``` ### 关键技术说明: 1. **FindWindow函数**:通过检测窗口标题判断进程状态,建议使用精确窗口标题 2. **GetPID插件**:需要安装扩展插件支持,可检测后台进程状态 3. **延时机制**:推荐使用500ms-1000ms的检测间隔,避免过高CPU占用 4. **超时处理**:必须设置最大等待时间,防止脚本死循环
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值