[按键精灵安卓/ios脚本插件开发] 遍历获取LuaAuxLib函数库命令辅助工具

LuaAuxLib库
LuaAuxLib是按键精灵所有内置命令所在的库文件,有多种方式来获取LuaAuxLib库下的函数命令,例如反编译按键精灵手机端库文件等。这里咱们来介绍一种浅显易懂的方式来获取,直接for循环遍历获取函数名。

ScanLuaAuxLib
我们写一个自定义插件函数ScanLuaAuxLib来实现遍历循环LuaAuxLib内的键值对内容,因为LuaAuxLib库的本质也是一个table数据,在这个table中的键名就是我们需要的命令名。遍历代码如下:

调试运行获取所有命令名
我们来调试运行下这个插件命令,看看输出的内容都是什么。

在调试信息中,所有命令名称都被输出显示,后面类型大部分都是function,表示命令函数的意思。从这些函数名称中,可以推断出对应按键精灵的命令,例如UI_AddButton就是对应UI.AddButton()命令,SetAutoLockTime对应的是Device.SetAutoLockTime()等,绝大多数都是有迹可循的。至于参数跟返回值,大部分也都是与按键精灵命令保持一致,具体还请大家自行测试。这里提下比较特殊的几个含返回参数的命令,一般返回参数是作为多个返回值实现的,例如找图命令LuaAuxLib.FindPicture(),它有8个参数,与按键精灵前8个保持一致,但是返回坐标参数被放到了返回值中,它有3个返回值,分别是返回X坐标,返回Y坐标,返回图片序号。由于篇幅有限,这里就不对每一个命令一一进行讲解了,还请大家自行测试摸索。

附:完整代码

local _zimao = {} --这是内部私有table函数
local zimao = {} --这是对外公开table函数
QMPlugin = zimao --通过这行代码, 实现将zimao表中所有函数对外公开_zimao.version = "20220306" --插件版本号, 方便自己记忆local function try(block) -- 保护执行函数
local tablejoin = function (...)
local result = {}
for _, t in ipairs({...}) do
if type(t) == "table" then
for k, v in pairs(t) do
if type(k) == "number" then table.insert(result, v)
else result[k] = v end
end
else
table.insert(result, t)
end
end
return result
end-- get the try function
local try = block[1]
assert(try)-- get catch and finally functions
local funcs = tablejoin(block[2] or {}, block[3] or {})-- try to call it
local result_error = {}
local results = {pcall(try)}
if not results[1] then
-- run the catch function
if funcs and funcs.catch then
result_error = {funcs.catch(results[2])}
end
end-- run the finally function
if funcs and funcs.finally then
local result_fin = {funcs.finally(table.unpack(results))}
if #result_fin > 0 then
return table.unpack(result_fin)
end
end-- ok?
if results[1] and #results > 1 then
return table.unpack(results, 2, #results)
else
if #result_error > 0 then
return table.unpack(result_error)
else
return nil
end
end
end
local function catch(block) --异常捕获函数
return {catch = block[1]}
end
local function finally(block) --最终必定执行函数
return {finally = block[1]}
end-- 常用的内部函数, 不加入私有table中, 直接定义使用
local function traceprint(...) --调用按键精灵的调试输出命令
if QMPlugin then -- 在Lua调试环境下, QMPlugin变量的值是我们插件公开table函数值, 而在按键精灵调试运行环境下, 该变量值被替换为nil
print(...)
else
-- 获取可变长参数的第一个参数值
local line = select(1, ...)
-- 如果第一个参数是字符串, 并且符合格式 _数字 , 则判定为行号意思
if type(line) == "string" and line:match("^%_%d+$") then
-- 第一个参数按照格式 _数字: 传入TracePrint中可实现打印行号功能
LuaAuxLib.TracePrint(line .. ":", table.concat({...}, " ", 2, select("#", ...)))
elseif line == ":" and #{...} > 1 then
-- 第一个参数是冒号 : 时, 表示直接打印输出数据
LuaAuxLib.TracePrint(":", table.concat({...}, " ", 2, select("#", ...)))
else
-- 其他的情况下则加上前缀后, 进行正常输出
LuaAuxLib.TracePrint(":","紫猫学院测试插件:", ...)
end
end
end-- 实现获取变量信息的插件函数, 需对外公开, 所以使用zimao前缀
function zimao.VarInfo(...)
-- 防止无法获取nil参数
local paramCount = select("#", ...)
local varType, printStr, t = "", "", {}
for i = 1, paramCount do
local v = select(i, ...)
try {
function()
varType = type(v)
if varType == "table" then
printStr = "【" .. varType .." " .. tostring(#v) .. "】" .. LuaAuxLib.Encode_GetJsonLib():encode(v)
elseif varType == "number" or varType == "string" then
printStr = "【" .. varType .." " .. tostring(#tostring(v)) .. "】" .. tostring(v)
elseif varType == "boolean" or varType == "null" then
printStr = "【" .. varType .."】" .. tostring(v)
else
printStr = "【" .. varType .."】 未知数据,无法查看!"
end
table.insert( t, #t + 1, printStr )
end,
catch {
function (errors)
-- 下面这个traceprint是我们上面定义过的内部输出命令,注意大小写
traceprint("发生运行时错误!错误代码:VarInfo(),错误信息:", errors)
end
}
}
end
printStr = table.concat( t, ", " )
return printStr
end-- 实现打印输出变量详细信息数据, 需对外公开
function zimao.TracePrint(...)
-- 通过VarInfo函数获取参数的详细数据信息
local info = zimao.VarInfo(...)
try {
function()
-- 在保护模式下打印输出这个数据内容
traceprint(info)
end,
catch {
function (errors)
traceprint("发生运行时错误!错误代码:TracePrint(),错误信息:", errors)
end
}
}
endfunction zimao.ScanLuaAuxLib()
-- 以保护模式运行, 避免插件错误造成脚本终止
try {
function()
-- 遍历LuaAuxLib内的内容
for k, v in pairs(LuaAuxLib) do
-- 使用自定义函数traceprint在按键精灵中打印函数名
traceprint("名称: " .. k, "类型: " .. type(v))
end
end,
catch {
function (errors)
traceprint("发生运行时错误!错误代码:ScanLuaAuxLib(),错误信息:", errors)
end
}
}
end

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84963.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习和计算机视觉的关系的理解

深度学习和计算机视觉的关系 深度学习作为人工智能的重要分支,近年来在计算机视觉领域取得了革命性突破。计算机视觉的核心任务包括图像分类、目标检测、语义分割等,而深度学习通过神经网络模型自动学习图像特征,极大提升了这些任务的准确率…

springboot开发项目 SLF4J+Logback日志框架集成【最终篇】

在这篇文章之前,实际对于 springboot和SLF4JLogback日志框架的使用 我已经分享过3篇关于springboot 日志的文章了。为什么会在写这篇最终篇,因为 前3篇分享的关于springBoot框架日志的配置方案, 发现了一个问题:只有项目启动的时候…

phpstudy无法启动apache,80端口被占用,完美解决

phpstudy无法启动apache,80端口被占用,完美解决 解决方法一(最推荐) 依次点击网站-管理-修改 将端口由80改为81,再点击确认后即可重新启动apache。 需要注意的是,网站的访问由127.0.0.1变为127.0.0.1:81。默认是80的端口所以可以不…

Loggers 配置解析(log4j.xml)

Loggers 配置解析 我们通过下面的例子来理解 log4j 的 Loggers 配置是如何决定日志输出规则的。 <Loggers><!-- 根Logger&#xff1a;全局配置 --><Root level"debug"><AppenderRef ref"consoleAppender" level"info"/&g…

Java 大视界 -- Java 大数据在智能政务舆情监测与引导中的情感分析与话题挖掘技术(272)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

[NocoDB] 在局域网中调整Float类型显示精度的部署经验

在单位局域网环境中,NocoDB有效地连接MySQL数据库和前端服务,做为中间件很方便。然而,在实际应用中,我们也会遇到一些较为隐藏的设置问题,比如此次经历的 float 显示精度不匹配问题。 问题环境 实际数据库:MySQL,表中有 float 类型的数据 原始数据来源:Excel表格 数据转…

Dockerfile 常见指令详解

Dockerfile 是一个文本文件&#xff0c;包含了一系列用于构建 Docker 镜像的指令。以下是 Dockerfile 中常见指令的详细解释&#xff1a; 基础指令 1. FROM 指定基础镜像&#xff0c;必须为第一条指令&#xff08;注释除外&#xff09;。 FROM ubuntu:20.04 FROM python:3.…

InnoDB Cluster 与 NDB Cluster 对比及部署指南

InnoDB Cluster 与 NDB Cluster 对比及部署指南 一、核心区别对比 特性InnoDB ClusterNDB Cluster存储引擎InnoDBNDB (内存优先)架构设计基于Group Replication分布式架构(数据节点管理节点SQL节点)一致性模型最终一致性/强一致性强一致性数据持久化磁盘存储为主内存存储为主…

PySide环境配置及工具使用

文章目录 [toc]1 概述1.1 PySide 能做什么&#xff1f;1.2 PySide 的优点1.3 PySide 的缺点1.4 示例代码&#xff08;简单窗口&#xff09; 2 环境准备2.1 安装必要软件2.2 修改 pip 源 3 PySide23.1 环境要求3.2 配置PySide23.3 工具配置 4 PySide64.1 环境4.2 配置PySide64.3…

数据标注师学习内容

目录 文本标注词性标注实体标注 图像标注语音标注 文本标注 词性标注 第一篇 第二篇 实体标注 点击这里 关系标注 事件标注 意图标注 关键词标注 分类标注 问答标注 对话标注 图像标注 拉框标注 关键点标注 2D标注 3D标注 线标注 目标跟踪标注 OCR标注 图像分类标注 语音…

【linux】文件与目录命令 - rsync

文章目录 1. 基本用法2. 常用参数3. 用法举例4. 注意事项 rsync 命令用于快速同步文件和目录&#xff0c;可用于本地和远程传输&#xff0c;支持增量同步、压缩、权限保留等特性。 1. 基本用法 语法&#xff1a; rsync [选项] 源 目标功能&#xff1a; 高效增量同步&#xff…

互联网大厂Java求职面试:电商系统高并发设计

互联网大厂Java求职面试&#xff1a;电商系统高并发设计 文章内容 面试官&#xff08;技术总监&#xff09;与郑薪苦的对话 面试官&#xff1a; “郑薪苦&#xff0c;欢迎来到我们的面试。今天我们会围绕一个非常热门的话题——电商系统的高并发设计进行深入探讨。你之前在某…

Nginx跨云反向代理排错:解密配置参数的“陷阱”

前言&#xff1a;在当今的云计算环境中&#xff0c;跨云平台的应用部署变得越来越常见。为了验证跨云平台反向代理的可行性&#xff0c;我们进行了一次测试。本次测试将后端程序部署在阿里云服务器&#xff0c;同时使用在腾讯云注册的已备案国内域名。我们在腾讯云控制台将域名…

股票账户的管理和交易

中国证券登记结算有限责任公司&#xff08;简称“中国结算”&#xff09;确实是负责股票的账户管理&#xff08;开户、销户&#xff09;和登记、存管、清算、交收等后台业务的中央机构。它确保了股票所有权的准确记录和交易后资金与证券的最终转移。 而股票的交易业务&#xff…

Arcgis地理配准变换方法说明

零阶多项式 - 将使用零阶多项式来平移数据。 当已对数据进行地理配准但通过微小的平移可以更好的排列数据时&#xff0c;通常使用该多项式。 执行零阶多项式平移只需要一个连接线。相似性多项式 - 将使用一阶变换&#xff0c;尝试保持原始栅格的形状。 RMS 错误会高于其他多项式…

深入理解 C++ volatile 与 atomic:五大用法解析 + 六大高频考点

一、volatile volatile是C中一个非常重要的关键字。volatile关键字告诉编译器&#xff0c;被修饰的变量可能会在程序控制之外被改变&#xff0c;因此编译器不能对该变量的访问进行优化。什么意思呢&#xff1f;现代处理器架构中&#xff0c;有寄存器&#xff0c;L1缓存&#x…

跨主机管理Docker容器化应用的操作与技巧

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; 环境准备与 Docker 安装 在开始跨主机管理 Docker 容器化应用之前&#xff0c;需要确保所有主机上都安装了 Docker 引擎&#xff0c;并且这些主机之间可以通过 SSH 协议进行通信。本节将详细介绍环境准备和 Doc…

编程实践:sigmastar330 调用IVE图像处理加速

说明:本专栏文章有两种解锁方案 1:付费订阅,畅享所有文章 2:免费获取,点击下方链接,关注,自动获取免费链接 https://free-img.400040.xyz/4/2025/04/29/6810a50b7ac8b.jpg 主题:利用IVE进行图像处理加速 Sigmastar 支持的硬件操作,基本都在:mi_ive.h 文件中,本文…

Nginx+PHP+MySQL安装参考

NginxPHPMySQL安装参考 CentOS7环境 配置CentOS7网络&#xff1a; CentOS(最小安装)默认是不打开网络的 启动网络 vi打开&#xff1a;/etc/sysconfig/network-scripts/ifcfg-ens33 文件 将 “ONBOOT:no”属性修改为&#xff1a;“ONBOOT:yes” 重启网络服务 # sudo service …

JavaScript中的反射魔法:揭秘Reflect对象的核心方法(下)

JavaScript中的Reflect对象&#xff1a;高级方法解析&#xff08;下&#xff09; 在JavaScript中&#xff0c;Reflect对象不仅提供了基础的对象操作方法&#xff08;如get、set等&#xff09;&#xff0c;还包含了许多高级API&#xff0c;用于更精细地控制对象行为。本文将继续…