[按鍵精靈安卓/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
英文地址,請注明出處:http://en.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;用于更精細地控制對象行為。本文將繼續…