第一个问题:desc()通过描述来获取控件,但有没有方法可以无需提供此控件的完整描述,也可以使用此方法来获取控件?比如现有一个控件的描述为“等待xx秒后点击可以获取xx金币,看的越久赚的越多”,是个很长的描述,而且里面的xx表示一个时刻变化的数字,每一次都不一样。那我就不能用一个固定的字符串来获取此控件了。所以有没有方法可以只写此控件的一部分描述就可以获取到控件?比如descInclude("秒后点击可以获取")就能返回这个控件?hamibot具有类似的函数可调用吗?
第二个问题:关于images.pixel(),这个方法使用之前必须要申请截图权限吗?我调用这个方法以后返回值是-1,是怎么回事?再就是此函数返回的0xAARRGGBB是一个数字还是一个字符串?给我提供一个使用这个方法的完整例子,告诉我返回的颜色值如何单独去获取每个分量?也就是单独分成argb三个分量。
回答
第一个问题:模糊匹配控件描述
Hamibot 的 UI 选择器不支持 descInclude(),但提供了完全符合你需求的 descContains() 方法。你不需要提供完整描述,只需传入固定片段即可匹配包含该片段的控件。
除了包含匹配,Hamibot 还提供以下描述匹配方法,可应对不同场景:
descContains(str):描述包含指定字符串descStartsWith(str):描述以指定字符串开头descEndsWith(str):描述以指定字符串结尾descMatches(regexp):使用正则表达式匹配(适合更复杂的动态内容)
针对你的场景,直接使用 descContains() 即可:
// 文档地址 https://docs.hamibot.com/
var target = descContains("秒后点击可以获取").findOne(2000);
if (target) {
toastLog("成功找到控件");
target.click();
} else {
toastLog("未找到匹配控件");
}
建议配合 findOne(timeout) 使用,避免控件尚未加载时脚本直接返回 null。
第二个问题:images.pixel() 使用详解
1. 是否必须申请截图权限?
必须申请。images.pixel() 作用于 Image 对象,而获取当前屏幕的 Image 对象需要调用 captureScreen(),该函数强依赖 requestScreenCapture() 授予的截图权限。未授权或授权失败时调用会直接报错或返回无效数据。
2. 为什么返回值是 -1?
images.pixel() 返回的是 32 位有符号整数。-1 对应的十六进制是 0xFFFFFFFF(不透明的纯白色)。返回 -1 通常有两种情况:
- 该坐标点的实际颜色就是白色。
- 传入的
(x, y)坐标超出了图片的实际宽高范围,或图片对象已被回收/为空。此时底层也会返回-1。
请确保坐标满足0 <= x < img.getWidth()且0 <= y < img.getHeight()。
3. 返回值是数字还是字符串?
是 数字(Number)。格式为 0xAARRGGBB 的 32 位整型数值。JavaScript 不区分整型与浮点型,但在底层按 32 位整数处理。
4. 完整示例与 ARGB 分量提取
Hamibot 内置了 colors 模块,可直接安全地解析该数值。你也可以使用位运算。以下为完整兼容示例:
// 文档地址 https://docs.hamibot.com/
if (!requestScreenCapture(true)) {
toastLog('没有授予 Hamibot 屏幕截图权限');
hamibot.exit();
}
sleep(1000);
var img = captureScreen();
var x = 100;
var y = 100;
// 校验坐标合法性,防止越界返回 -1
if (x >= 0 && x < img.getWidth() && y >= 0 && y < img.getHeight()) {
var colorVal = images.pixel(img, x, y);
toastLog('原始颜色值(十进制): ' + colorVal);
// 推荐方式:使用内置 colors 模块提取分量
var a = colors.alpha(colorVal);
var r = colors.red(colorVal);
var g = colors.green(colorVal);
var b = colors.blue(colorVal);
toastLog('colors模块 -> A:' + a + ' R:' + r + ' G:' + g + ' B:' + b);
// 备选方式:使用位运算提取分量(结果与上方一致)
var a2 = (colorVal >> 24) & 0xFF;
var r2 = (colorVal >> 16) & 0xFF;
var g2 = (colorVal >> 8) & 0xFF;
var b2 = colorVal & 0xFF;
toastLog('位运算解析 -> A:' + a2 + ' R:' + r2 + ' G:' + g2 + ' B:' + b2);
} else {
toastLog('坐标超出图片范围,请检查 x y 值');
}
// 最佳实践:截图对象使用完毕后务必回收,防止内存泄漏
img.recycle();
hamibot.exit();
最佳实践提示
- 频繁调用
captureScreen()会消耗较多性能,若需连续取色,建议只截图一次,多次调用images.pixel()。 - Rhino 1.7.15 引擎对位运算的支持稳定,但直接使用
colors模块可读性更高且不易出错。 - 脚本中涉及图片对象的操作,结束后必须调用
img.recycle()释放 native 内存,否则长时间运行极易触发 OOM。