注册 登录
发贴工具
查看: 6|回复: 0
打印 上一主题 下一主题

[24小时收录超级好的网站] 苹果脚本屏幕类screen例子

[复制链接]

2504

主题

2552

帖子

1万

积分

积分
15210
跳转到指定楼层
楼主
苹果脚本屏幕类screen例子
苹果脚本屏幕类screen例子 群发软件发帖工具
苹果脚本屏幕类screen例子 群发软件发帖工具

  1. /**
  2. * ============================================
  3. * AIWROK 智能屏幕自动化助手 Pro
  4. * 版本:1.0.0
  5. * 平台:iOS (AIWROK)
  6. * QQ 群:711841924 群一,苹果内测群 528816639
  7. * ============================================
  8. *
  9. * 功能特性:
  10. * 1. 🎯 OCR 智能识别屏幕应用图标
  11. * 2. 👆 自动点击打开目标应用
  12. * 3. 📊 H5 可视化控制面板
  13. * 4. 📝 实时日志记录系统
  14. * 5. ⚡ 一键快捷操作
  15. * 6. 🔍 自定义区域扫描
  16. */

  17. // ==================== 全局配置 ====================
  18. var AppConfig = {
  19.     appName: "智能屏幕自动化助手 Pro",
  20.     version: "1.0.0",
  21.     debugMode: true,
  22.     ocrRegion: [0, 0, 1, 1], // 默认全屏 OCR
  23.     clickDelay: 500, // 点击延迟 (ms)
  24.     retryTimes: 3, // 重试次数
  25.     logEnabled: true
  26. };

  27. // ==================== 工具函数 ====================

  28. /**
  29. * 阻塞延迟函数
  30. * @param {number} ms - 毫秒数
  31. */
  32. function sleep(ms) {
  33.     var start = Date.now();
  34.     while (Date.now() - start < ms) {
  35.         // 阻塞等待
  36.     }
  37. }

  38. /**
  39. * 输出日志 (兼容多种日志方式)
  40. * @param {string} message - 日志内容
  41. */
  42. function log(message) {
  43.     if (AppConfig.logEnabled) {
  44.         printl(message);
  45.         // 同时发送到 LogManagerH5(如果可用)
  46.         try {
  47.             LogManagerH5.info(message);
  48.         } catch (e) {
  49.             // LogManagerH5 不可用时忽略
  50.         }
  51.     }
  52. }

  53. /**
  54. * 输出分隔线
  55. */
  56. function separator() {
  57.     log("========================================");
  58. }

  59. // ==================== 核心功能类 ====================

  60. /**
  61. * 屏幕操作管理器
  62. */
  63. var ScreenManager = {
  64.     /**
  65.      * 获取屏幕尺寸
  66.      */
  67.     getScreenSize: function() {
  68.         return {
  69.             width: screen.getScreenWidth(),
  70.             height: screen.getScreenHeight()
  71.         };
  72.     },
  73.    
  74.     /**
  75.      * 全尺寸截图
  76.      * @returns {Image} 截图对象
  77.      */
  78.     captureFull: function() {
  79.         try {
  80.             log("[截图] 执行全尺寸截图...");
  81.             var image = screen.screenShotFull();
  82.             log("[截图] 截图完成");
  83.             return image;
  84.         } catch (e) {
  85.             log("[错误] 截图失败:" + e);
  86.             return null;
  87.         }
  88.     },
  89.    
  90.     /**
  91.      * 缩放截图
  92.      * @param {number} width - 宽度
  93.      * @param {number} height - 高度
  94.      * @param {number} compress - 压缩率 (0-100)
  95.      * @returns {Image} 截图对象
  96.      */
  97.     captureScaled: function(width, height, compress) {
  98.         try {
  99.             log("[截图] 执行缩放截图:" + width + "x" + height + ", 压缩率:" + compress);
  100.             var image = screen.screenShot(width, height, compress);
  101.             log("[截图] 截图完成");
  102.             return image;
  103.         } catch (e) {
  104.             log("[错误] 截图失败:" + e);
  105.             return null;
  106.         }
  107.     },
  108.    
  109.     /**
  110.      * 执行 OCR 识别
  111.      * @param {Image} image - 图像对象
  112.      * @param {Array} region - 识别区域 [left, top, right, bottom]
  113.      * @returns {OcrResult} OCR 结果
  114.      */
  115.     recognizeText: function(image, region) {
  116.         try {
  117.             var ocrRegion = region || AppConfig.ocrRegion;
  118.             log("[OCR] 开始识别,区域:[" + ocrRegion.join(", ") + "]");
  119.             var result = image.ocr(ocrRegion[0], ocrRegion[1], ocrRegion[2], ocrRegion[3]);
  120.             log("[OCR] 识别完成");
  121.             return result;
  122.         } catch (e) {
  123.             log("[错误] OCR 识别失败:" + e);
  124.             return null;
  125.         }
  126.     },
  127.    
  128.     /**
  129.      * 锁定屏幕缓存
  130.      */
  131.     lockCache: function() {
  132.         try {
  133.             screen.lockScreen();
  134.             log("[缓存] 屏幕缓存已锁定");
  135.         } catch (e) {
  136.             log("[错误] 锁定缓存失败:" + e);
  137.         }
  138.     },
  139.    
  140.     /**
  141.      * 解锁屏幕缓存
  142.      */
  143.     unlockCache: function() {
  144.         try {
  145.             screen.unLockScreen();
  146.             log("[缓存] 屏幕缓存已解锁");
  147.         } catch (e) {
  148.             log("[错误] 解锁缓存失败:" + e);
  149.         }
  150.     }
  151. };

  152. /**
  153. * 点击操作管理器
  154. */
  155. var ClickManager = {
  156.     /**
  157.      * 百分比位置点击
  158.      * @param {number} xPercent - X 轴百分比 (0-1)
  159.      * @param {number} yPercent - Y 轴百分比 (0-1)
  160.      */
  161.     clickPercent: function(xPercent, yPercent) {
  162.         try {
  163.             log("[点击] 百分比坐标:(" + xPercent + ", " + yPercent + ")");
  164.             hid.clickPercent(xPercent, yPercent);
  165.             sleep(AppConfig.clickDelay);
  166.             log("[点击] 点击成功");
  167.         } catch (e) {
  168.             log("[错误] 点击失败:" + e);
  169.         }
  170.     },
  171.    
  172.     /**
  173.      * 绝对坐标点击
  174.      * @param {number} x - X 坐标
  175.      * @param {number} y - Y 坐标
  176.      */
  177.     clickAbsolute: function(x, y) {
  178.         try {
  179.             log("[点击] 绝对坐标:(" + x + ", " + y + ")");
  180.             hid.click(x, y);
  181.             sleep(AppConfig.clickDelay);
  182.             log("[点击] 点击成功");
  183.         } catch (e) {
  184.             log("[错误] 点击失败:" + e);
  185.         }
  186.     },
  187.    
  188.     /**
  189.      * 点击 OCR 识别到的文本
  190.      * @param {Detect} detect - OCR 检测对象
  191.      * @param {string} clickType - 点击类型:"center" | "random"
  192.      */
  193.     clickOcrTarget: function(detect, clickType) {
  194.         try {
  195.             if (!detect) {
  196.                 log("[警告] 点击目标为空");
  197.                 return false;
  198.             }
  199.             
  200.             var rect = detect.getRect();
  201.             var centerX = rect.getCenterX();
  202.             var centerY = rect.getCenterY();
  203.             
  204.             if (clickType === "center") {
  205.                 log("[点击] 点击文本中心:(" + centerX + ", " + centerY + ")");
  206.                 this.clickAbsolute(centerX, centerY);
  207.             } else {
  208.                 log("[点击] 随机点击文本区域");
  209.                 detect.clickRandom();
  210.             }
  211.             
  212.             log("[点击] 点击成功");
  213.             return true;
  214.         } catch (e) {
  215.             log("[错误] 点击失败:" + e);
  216.             return false;
  217.         }
  218.     },
  219.    
  220.     /**
  221.      * 双击操作
  222.      * @param {number} xPercent - X 轴百分比
  223.      * @param {number} yPercent - Y 轴百分比
  224.      */
  225.     doubleClick: function(xPercent, yPercent) {
  226.         try {
  227.             log("[双击] 百分比坐标:(" + xPercent + ", " + yPercent + ")");
  228.             hid.doubleClickPercent(xPercent, yPercent);
  229.             sleep(AppConfig.clickDelay * 2);
  230.             log("[双击] 双击成功");
  231.         } catch (e) {
  232.             log("[错误] 双击失败:" + e);
  233.         }
  234.     }
  235. };

  236. /**
  237. * OCR 文本查找管理器
  238. */
  239. var OcrSearchManager = {
  240.     /**
  241.      * 查找精确文本
  242.      * @param {OcrResult} ocrResult - OCR 结果
  243.      * @param {string} text - 要查找的文本
  244.      * @param {Array} region - 查找区域
  245.      * @returns {Detect} 检测结果
  246.      */
  247.     findExactText: function(ocrResult, text, region) {
  248.         try {
  249.             log("[查找] 精确查找文本:\"" + text + "\"");
  250.             var result = ocrResult.findText(text, region || AppConfig.ocrRegion);
  251.             if (result) {
  252.                 log("[查找] 找到文本");
  253.             } else {
  254.                 log("[查找] 未找到文本");
  255.             }
  256.             return result;
  257.         } catch (e) {
  258.             log("[错误] 查找失败:" + e);
  259.             return null;
  260.         }
  261.     },
  262.    
  263.     /**
  264.      * 查找包含文本
  265.      * @param {OcrResult} ocrResult - OCR 结果
  266.      * @param {string} text - 要查找的文本
  267.      * @param {Array} region - 查找区域
  268.      * @returns {Detect} 检测结果
  269.      */
  270.     findIncludeText: function(ocrResult, text, region) {
  271.         try {
  272.             log("[查找] 查找包含文本:\"" + text + "\"");
  273.             var result = ocrResult.findIncludeText(text, region || AppConfig.ocrRegion);
  274.             if (result) {
  275.                 log("[查找] 找到文本");
  276.             } else {
  277.                 log("[查找] 未找到文本");
  278.             }
  279.             return result;
  280.         } catch (e) {
  281.             log("[错误] 查找失败:" + e);
  282.             return null;
  283.         }
  284.     },
  285.    
  286.     /**
  287.      * 使用正则表达式查找
  288.      * @param {OcrResult} ocrResult - OCR 结果
  289.      * @param {string} regex - 正则表达式
  290.      * @param {Array} region - 查找区域
  291.      * @returns {Array} 检测结果数组
  292.      */
  293.     findTextWithRegex: function(ocrResult, regex, region) {
  294.         try {
  295.             log("[查找] 使用正则查找:" + regex);
  296.             var results = ocrResult.findTextWithRegex(regex, region || AppConfig.ocrRegion);
  297.             if (results && results.length > 0) {
  298.                 log("[查找] 找到 " + results.length + " 个匹配项");
  299.             } else {
  300.                 log("[查找] 未找到匹配项");
  301.             }
  302.             return results;
  303.         } catch (e) {
  304.             log("[错误] 查找失败:" + e);
  305.             return null;
  306.         }
  307.     },
  308.    
  309.     /**
  310.      * 获取所有检测结果
  311.      * @param {OcrResult} ocrResult - OCR 结果
  312.      * @returns {Array} 所有检测结果
  313.      */
  314.     getAllDetects: function(ocrResult) {
  315.         try {
  316.             log("[查找] 获取所有检测结果");
  317.             var results = ocrResult.getAllDetect();
  318.             if (results) {
  319.                 log("[查找] 共找到 " + results.length + " 个文本块");
  320.             }
  321.             return results;
  322.         } catch (e) {
  323.             log("[错误] 获取失败:" + e);
  324.             return null;
  325.         }
  326.     }
  327. };

  328. // ==================== 业务功能 ====================

  329. /**
  330. * 应用启动器 - 通过 OCR 识别并点击应用图标
  331. */
  332. var AppLauncher = {
  333.     /**
  334.      * 启动应用
  335.      * @param {string} appName - 应用名称
  336.      * @param {number} maxRetries - 最大重试次数
  337.      * @returns {boolean} 是否成功
  338.      */
  339.     launchApp: function(appName, maxRetries) {
  340.         separator();
  341.         log("[启动器] 开始启动应用:" + appName);
  342.         
  343.         var retries = 0;
  344.         var actualMaxRetries = maxRetries || AppConfig.retryTimes;
  345.         
  346.         while (retries < actualMaxRetries) {
  347.             try {
  348.                 retries++;
  349.                 log("[启动器] 第 " + retries + " 次尝试...");
  350.                
  351.                 // 1. 截图
  352.                 var image = ScreenManager.captureFull();
  353.                 if (!image) {
  354.                     continue;
  355.                 }
  356.                
  357.                 // 2. OCR 识别
  358.                 var ocrResult = ScreenManager.recognizeText(image, AppConfig.ocrRegion);
  359.                 if (!ocrResult) {
  360.                     image.close();
  361.                     continue;
  362.                 }
  363.                
  364.                 // 3. 查找应用名称
  365.                 var appDetect = OcrSearchManager.findIncludeText(ocrResult, appName, AppConfig.ocrRegion);
  366.                
  367.                 if (appDetect) {
  368.                     log("[启动器] ✓ 找到应用图标");
  369.                     
  370.                     // 4. 点击应用
  371.                     var success = ClickManager.clickOcrTarget(appDetect, "center");
  372.                     
  373.                     // 5. 释放资源
  374.                     image.close();
  375.                     
  376.                     if (success) {
  377.                         log("[启动器] ✓✓ 应用启动成功!");
  378.                         separator();
  379.                         return true;
  380.                     }
  381.                 } else {
  382.                     log("[启动器] 未找到应用:" + appName);
  383.                     image.close();
  384.                 }
  385.                
  386.                 // 等待后重试
  387.                 if (retries < actualMaxRetries) {
  388.                     log("[启动器] 准备重试...");
  389.                     sleep(1000);
  390.                 }
  391.                
  392.             } catch (e) {
  393.                 log("[错误] 启动应用失败:" + e);
  394.             }
  395.         }
  396.         
  397.         log("[启动器] ✗✗ 应用启动失败 (已重试 " + actualMaxRetries + " 次)");
  398.         separator();
  399.         return false;
  400.     },
  401.    
  402.     /**
  403.      * 批量启动应用
  404.      * @param {Array} appList - 应用名称列表
  405.      */
  406.     launchMultipleApps: function(appList) {
  407.         separator();
  408.         log("[启动器] 开始批量启动应用");
  409.         
  410.         var successCount = 0;
  411.         
  412.         for (var i = 0; i < appList.length; i++) {
  413.             log("[启动器] 正在启动 (" + (i + 1) + "/" + appList.length + "): " + appList[i]);
  414.             
  415.             if (this.launchApp(appList[i], 2)) {
  416.                 successCount++;
  417.                 sleep(2000); // 应用间切换等待
  418.             } else {
  419.                 log("[启动器] 跳过失败应用,继续下一个");
  420.                 sleep(500);
  421.             }
  422.         }
  423.         
  424.         log("[启动器] 批量启动完成:成功 " + successCount + "/" + appList.length + " 个");
  425.         separator();
  426.     },
  427.    
  428.     /**
  429.      * 显示屏幕所有文本 (调试用)
  430.      */
  431.     showAllScreenText: function() {
  432.         separator();
  433.         log("[调试] 开始识别屏幕所有文本");
  434.         
  435.         var image = ScreenManager.captureFull();
  436.         if (!image) {
  437.             return;
  438.         }
  439.         
  440.         var ocrResult = ScreenManager.recognizeText(image, [0, 0, 1, 1]);
  441.         if (!ocrResult) {
  442.             image.close();
  443.             return;
  444.         }
  445.         
  446.         var allText = ocrResult.getAllString();
  447.         log("[调试] 屏幕文本内容:\n" + allText);
  448.         
  449.         var allDetects = OcrSearchManager.getAllDetects(ocrResult);
  450.         if (allDetects) {
  451.             log("[调试] 文本块数量:" + allDetects.length);
  452.             for (var i = 0; i < allDetects.length; i++) {
  453.                 var detect = allDetects[i];
  454.                 log("[调试]   [" + (i + 1) + "] " + detect.text);
  455.             }
  456.         }
  457.         
  458.         image.close();
  459.         separator();
  460.     }
  461. };

  462. // ==================== UI 界面 ====================

  463. /**
  464. * 创建主控制面板
  465. */
  466. function createControlPanel() {
  467.     var mainTab = new TabView();
  468.     mainTab.setTitles(["应用启动", "快捷操作", "系统设置"]);
  469.    
  470.     mainTab.show(() => {
  471.         log("[UI] 控制面板已启动");
  472.         
  473.         // 在每个页面顶部添加导航栏
  474.         mainTab.addView(0, createPageWithHeader(createAppLaunchView(mainTab), mainTab));
  475.         mainTab.addView(1, createPageWithHeader(createQuickActionsView(mainTab), mainTab));
  476.         mainTab.addView(2, createPageWithHeader(createSettingsView(mainTab), mainTab));
  477.         
  478.         log("[UI] 所有页面加载完成");
  479.     });
  480. }

  481. /**
  482. * 为页面添加导航栏
  483. * @param {Vertical} contentView - 内容视图
  484. * @param {TabView} tabView - TabView 实例
  485. * @returns {Vertical} 带导航栏的完整页面
  486. */
  487. function createPageWithHeader(contentView, tabView) {
  488.     var pageContainer = new Vertical();
  489.    
  490.     // 添加导航栏
  491.     var header = createHeader(tabView);
  492.     pageContainer.addView(header);
  493.    
  494.     // 添加内容区域
  495.     pageContainer.addView(contentView);
  496.    
  497.     return pageContainer;
  498. }

  499. /**
  500. * 创建上标头(带返回按钮和返回桌面按钮)
  501. * @param {TabView} tabView - TabView 实例
  502. * @returns {Vertical} 标头视图
  503. */
  504. function createHeader(tabView) {
  505.     var header = new Vertical();
  506.     header.setBackgroundColor(41, 128, 185);
  507.    
  508.     // 第一行:返回按钮 + 标题 + 桌面按钮
  509.     var titleBar = new Horizontal();
  510.    
  511.     // 返回按钮
  512.     var backBtn = new Button();
  513.     backBtn.setText("← 返回");
  514.     backBtn.setColor(255, 255, 255);
  515.     backBtn.setTextColor(41, 128, 185);
  516.     backBtn.setWidth(80);
  517.     backBtn.setHeight(40);
  518.     backBtn.onClick(() => {
  519.         log("[导航] 返回上一页");
  520.         try {
  521.             hid.back();
  522.         } catch (e) {
  523.             try {
  524.                 hid.home();
  525.                 log("[导航] ✓ 已返回主页");
  526.             } catch (e2) {
  527.                 log("[警告] 返回失败:" + e2);
  528.             }
  529.         }
  530.     });
  531.     titleBar.addView(backBtn);
  532.    
  533.     // 弹性占位(让标题居中)
  534.     var flexSpace1 = new Label();
  535.     flexSpace1.setWidth(-1);
  536.     titleBar.addView(flexSpace1);
  537.    
  538.     // 应用标题
  539.     var titleLabel = new Label();
  540.     titleLabel.setText("&#128640; " + AppConfig.appName);
  541.     titleLabel.setTextColor(255, 255, 255);
  542.     titleLabel.setFontSize(16);
  543.     titleBar.addView(titleLabel);
  544.    
  545.     // 弹性占位
  546.     var flexSpace2 = new Label();
  547.     flexSpace2.setWidth(-1);
  548.     titleBar.addView(flexSpace2);
  549.    
  550.     // 返回桌面按钮
  551.     var homeBtn = new Button();
  552.     homeBtn.setText("&#127968; 桌面");
  553.     homeBtn.setColor(46, 204, 113);
  554.     homeBtn.setTextColor(255, 255, 255);
  555.     homeBtn.setWidth(90);
  556.     homeBtn.setHeight(40);
  557.     homeBtn.onClick(() => {
  558.         log("[导航] 返回桌面");
  559.         try {
  560.             hid.home();
  561.             log("[导航] ✓ 已返回桌面");
  562.         } catch (e) {
  563.             log("[错误] 返回桌面失败:" + e);
  564.         }
  565.     });
  566.     titleBar.addView(homeBtn);
  567.    
  568.     header.addView(titleBar);
  569.    
  570.     return header;
  571. }

  572. /**
  573. * 应用启动页面
  574. * @param {TabView} mainTab - TabView 实例
  575. * @returns {Vertical} 页面视图
  576. */
  577. function createAppLaunchView(mainTab) {
  578.     var v = new Vertical();
  579.     v.setBackgroundColor(245, 247, 250);
  580.    
  581.     // 标题
  582.     var header = new Horizontal();
  583.     header.setAlignment("center");
  584.     var title = new Label();
  585.     title.setText("&#128640; 应用启动器");
  586.     title.setTextColor(41, 128, 185);
  587.     title.setFontSize(24);
  588.     header.addView(title);
  589.     v.addView(header);
  590.    
  591.     var divider = new Label();
  592.     divider.setHeight(2);
  593.     divider.setBackgroundColor(200, 200, 200);
  594.     v.addView(divider);
  595.    
  596.     // 常用应用按钮
  597.     var appContainer = new Vertical();
  598.     appContainer.setBackgroundColor(255, 255, 255);
  599.    
  600.     var apps = [
  601.         { name: "微信", color: [46, 204, 113] },
  602.         { name: "QQ", color: [52, 152, 219] },
  603.         { name: "支付宝", color: [52, 73, 94] },
  604.         { name: "抖音", color: [231, 76, 60] },
  605.         { name: "快手", color: [241, 196, 15] },
  606.         { name: "微博", color: [230, 0, 18] }
  607.     ];
  608.    
  609.     for (var i = 0; i < apps.length; i++) {
  610.         var appBtn = new Button();
  611.         appBtn.setText("启动 " + apps[i].name);
  612.         appBtn.setColor(apps[i].color[0], apps[i].color[1], apps[i].color[2]);
  613.         appBtn.setTextColor(255, 255, 255);
  614.         appBtn.setHeight(45);
  615.         (function(appName) {
  616.             appBtn.onClick(() => {
  617.                 log("[UI] 点击启动:" + appName);
  618.                 AppLauncher.launchApp(appName, 3);
  619.             });
  620.         })(apps[i].name);
  621.         appContainer.addView(appBtn);
  622.     }
  623.    
  624.     v.addView(appContainer);
  625.    
  626.     // 自定义输入
  627.     var inputContainer = new Horizontal();
  628.     inputContainer.setAlignment("center_vertical");
  629.    
  630.     var inputLabel = new Label();
  631.     inputLabel.setText("应用名称:");
  632.     inputLabel.setTextColor(50, 50, 50);
  633.     inputLabel.setWidth(100);
  634.     inputContainer.addView(inputLabel);
  635.    
  636.     var appInput = new Input();
  637.     appInput.setWidth(200);
  638.     inputContainer.addView(appInput);
  639.    
  640.     v.addView(inputContainer);
  641.    
  642.     var customLaunchBtn = new Button();
  643.     customLaunchBtn.setText("启动自定义应用");
  644.     customLaunchBtn.setColor(155, 89, 182);
  645.     customLaunchBtn.setTextColor(255, 255, 255);
  646.     customLaunchBtn.setHeight(45);
  647.     customLaunchBtn.onClick(() => {
  648.         var appName = appInput.getText();
  649.         if (appName) {
  650.             log("[UI] 启动自定义应用:" + appName);
  651.             AppLauncher.launchApp(appName, 3);
  652.             appInput.setText("");
  653.         } else {
  654.             log("[UI] 请输入应用名称");
  655.         }
  656.     });
  657.     v.addView(customLaunchBtn);
  658.    
  659.     // 批量启动
  660.     var batchBtn = new Button();
  661.     batchBtn.setText("批量启动 (微信+QQ+支付宝)");
  662.     batchBtn.setColor(52, 152, 219);
  663.     batchBtn.setTextColor(255, 255, 255);
  664.     batchBtn.setHeight(45);
  665.     batchBtn.onClick(() => {
  666.         AppLauncher.launchMultipleApps(["微信", "QQ", "支付宝"]);
  667.     });
  668.     v.addView(batchBtn);
  669.    
  670.     // 关闭按钮
  671.     var closeBtn = new Button();
  672.     closeBtn.setText("❌ 关闭面板");
  673.     closeBtn.setColor(149, 165, 166);
  674.     closeBtn.setTextColor(255, 255, 255);
  675.     closeBtn.setHeight(40);
  676.     closeBtn.onClick(() => {
  677.         log("[UI] 关闭控制面板");
  678.         if (mainTab) {
  679.             mainTab.dismiss();
  680.         }
  681.     });
  682.     v.addView(closeBtn);
  683.    
  684.     return v;
  685. }

  686. /**
  687. * 快捷操作页面
  688. * @param {TabView} mainTab - TabView 实例
  689. * @returns {Vertical} 页面视图
  690. */
  691. function createQuickActionsView(mainTab) {
  692.     var v = new Vertical();
  693.     v.setBackgroundColor(245, 247, 250);
  694.    
  695.     // 标题
  696.     var header = new Horizontal();
  697.     header.setAlignment("center");
  698.     var title = new Label();
  699.     title.setText("⚡ 快捷操作");
  700.     title.setTextColor(41, 128, 185);
  701.     title.setFontSize(24);
  702.     header.addView(title);
  703.     v.addView(header);
  704.    
  705.     var divider = new Label();
  706.     divider.setHeight(2);
  707.     divider.setBackgroundColor(200, 200, 200);
  708.     v.addView(divider);
  709.    
  710.     // 快捷按钮组
  711.     var quickContainer = new Vertical();
  712.     quickContainer.setBackgroundColor(255, 255, 255);
  713.    
  714.     // 屏幕中心点击
  715.     var centerClickBtn = new Button();
  716.     centerClickBtn.setText("点击屏幕中心");
  717.     centerClickBtn.setColor(46, 204, 113);
  718.     centerClickBtn.setTextColor(255, 255, 255);
  719.     centerClickBtn.setHeight(45);
  720.     centerClickBtn.onClick(() => {
  721.         log("[快捷] 点击屏幕中心");
  722.         ClickManager.clickPercent(0.5, 0.5);
  723.     });
  724.     quickContainer.addView(centerClickBtn);
  725.    
  726.     // 双击屏幕中心
  727.     var doubleClickBtn = new Button();
  728.     doubleClickBtn.setText("双击屏幕中心");
  729.     doubleClickBtn.setColor(241, 196, 15);
  730.     doubleClickBtn.setTextColor(50, 50, 50);
  731.     doubleClickBtn.setHeight(45);
  732.     doubleClickBtn.onClick(() => {
  733.         log("[快捷] 双击屏幕中心");
  734.         ClickManager.doubleClick(0.5, 0.5);
  735.     });
  736.     quickContainer.addView(doubleClickBtn);
  737.    
  738.     // 显示屏幕文本
  739.     var showTextBtn = new Button();
  740.     showTextBtn.setText("显示屏幕所有文本");
  741.     showTextBtn.setColor(52, 152, 219);
  742.     showTextBtn.setTextColor(255, 255, 255);
  743.     showTextBtn.setHeight(45);
  744.     showTextBtn.onClick(() => {
  745.         AppLauncher.showAllScreenText();
  746.     });
  747.     quickContainer.addView(showTextBtn);
  748.    
  749.     // 刷新 OCR
  750.     var refreshOcrBtn = new Button();
  751.     refreshOcrBtn.setText("刷新 OCR 缓存");
  752.     refreshOcrBtn.setColor(155, 89, 182);
  753.     refreshOcrBtn.setTextColor(255, 255, 255);
  754.     refreshOcrBtn.setHeight(45);
  755.     refreshOcrBtn.onClick(() => {
  756.         log("[快捷] 刷新 OCR 缓存");
  757.         ScreenManager.lockCache();
  758.         sleep(500);
  759.         ScreenManager.unlockCache();
  760.         log("[快捷] 刷新完成");
  761.     });
  762.     quickContainer.addView(refreshOcrBtn);
  763.    
  764.     v.addView(quickContainer);
  765.    
  766.     return v;
  767. }

  768. /**
  769. * 系统设置页面
  770. * @param {TabView} mainTab - TabView 实例
  771. * @returns {Vertical} 页面视图
  772. */
  773. function createSettingsView(mainTab) {
  774.     var v = new Vertical();
  775.     v.setBackgroundColor(245, 247, 250);
  776.    
  777.     // 标题
  778.     var header = new Horizontal();
  779.     header.setAlignment("center");
  780.     var title = new Label();
  781.     title.setText("⚙️ 系统设置");
  782.     title.setTextColor(41, 128, 185);
  783.     title.setFontSize(24);
  784.     header.addView(title);
  785.     v.addView(header);
  786.    
  787.     var divider = new Label();
  788.     divider.setHeight(2);
  789.     divider.setBackgroundColor(200, 200, 200);
  790.     v.addView(divider);
  791.    
  792.     // 设置容器
  793.     var settingsContainer = new Vertical();
  794.     settingsContainer.setBackgroundColor(255, 255, 255);
  795.    
  796.     // 日志开关
  797.     var logCheck = new CheckBox();
  798.     logCheck.setText("启用日志记录");
  799.     logCheck.setID("日志开关");
  800.     logCheck.setDefultSelect(); // 默认选中
  801.     logCheck.onClick(() => {
  802.         AppConfig.logEnabled = logCheck.isSelect();
  803.         log("[设置] 日志记录:" + (AppConfig.logEnabled ? "已开启" : "已关闭"));
  804.     });
  805.     settingsContainer.addView(logCheck);
  806.    
  807.     // 点击延迟设置
  808.     var delayContainer = new Horizontal();
  809.     delayContainer.setAlignment("center_vertical");
  810.    
  811.     var delayLabel = new Label();
  812.     delayLabel.setText("点击延迟:");
  813.     delayLabel.setTextColor(50, 50, 50);
  814.     delayLabel.setWidth(100);
  815.     delayContainer.addView(delayLabel);
  816.    
  817.     var delayInput = new Input();
  818.     delayInput.setWidth(100);
  819.     delayInput.setText(String(AppConfig.clickDelay));
  820.     delayContainer.addView(delayInput);
  821.    
  822.     var delayUnit = new Label();
  823.     delayUnit.setText(" ms");
  824.     delayUnit.setTextColor(100, 100, 100);
  825.     delayContainer.addView(delayUnit);
  826.    
  827.     settingsContainer.addView(delayContainer);
  828.    
  829.     var saveDelayBtn = new Button();
  830.     saveDelayBtn.setText("保存延迟设置");
  831.     saveDelayBtn.setColor(52, 152, 219);
  832.     saveDelayBtn.setTextColor(255, 255, 255);
  833.     saveDelayBtn.setHeight(40);
  834.     saveDelayBtn.onClick(() => {
  835.         var delayText = delayInput.getText();
  836.         var delay = parseInt(delayText);
  837.         if (delay > 0) {
  838.             AppConfig.clickDelay = delay;
  839.             log("[设置] 点击延迟已保存:" + delay + "ms");
  840.         } else {
  841.             log("[设置] 请输入有效的延迟值");
  842.         }
  843.     });
  844.     settingsContainer.addView(saveDelayBtn);
  845.    
  846.     // 重试次数设置
  847.     var retryContainer = new Horizontal();
  848.     retryContainer.setAlignment("center_vertical");
  849.    
  850.     var retryLabel = new Label();
  851.     retryLabel.setText("重试次数:");
  852.     retryLabel.setTextColor(50, 50, 50);
  853.     retryLabel.setWidth(100);
  854.     retryContainer.addView(retryLabel);
  855.    
  856.     var retryInput = new Input();
  857.     retryInput.setWidth(100);
  858.     retryInput.setText(String(AppConfig.retryTimes));
  859.     retryContainer.addView(retryInput);
  860.    
  861.     settingsContainer.addView(retryContainer);
  862.    
  863.     var saveRetryBtn = new Button();
  864.     saveRetryBtn.setText("保存重试次数");
  865.     saveRetryBtn.setColor(46, 204, 113);
  866.     saveRetryBtn.setTextColor(255, 255, 255);
  867.     saveRetryBtn.setHeight(40);
  868.     saveRetryBtn.onClick(() => {
  869.         var retryText = retryInput.getText();
  870.         var retry = parseInt(retryText);
  871.         if (retry > 0) {
  872.             AppConfig.retryTimes = retry;
  873.             log("[设置] 重试次数已保存:" + retry);
  874.         } else {
  875.             log("[设置] 请输入有效的重试次数");
  876.         }
  877.     });
  878.     settingsContainer.addView(saveRetryBtn);
  879.    
  880.     v.addView(settingsContainer);
  881.    
  882.     // 关于信息
  883.     var aboutDivider = new Label();
  884.     aboutDivider.setHeight(1);
  885.     aboutDivider.setBackgroundColor(180, 180, 180);
  886.     v.addView(aboutDivider);
  887.    
  888.     var aboutLabel = new Label();
  889.     aboutLabel.setText("\n" + AppConfig.appName + " v" + AppConfig.version + "\nQQ 群:711841924\n基于 AIWROK 开发平台");
  890.     aboutLabel.setTextColor(100, 100, 100);
  891.     aboutLabel.setFontSize(14);
  892.     v.addView(aboutLabel);
  893.    
  894.     return v;
  895. }

  896. // ==================== 主程序入口 ====================

  897. /**
  898. * 启动演示模式 - 展示所有功能
  899. */
  900. function runDemo() {
  901.     log("========================================");
  902.     log("&#127822; 智能屏幕自动化助手 Pro v" + AppConfig.version);
  903.     log("========================================");
  904.     log("[演示] 开始功能演示...");
  905.    
  906.     // 1. 显示屏幕信息
  907.     var screenSize = ScreenManager.getScreenSize();
  908.     log("[演示] 屏幕分辨率:" + screenSize.width + "x" + screenSize.height);
  909.    
  910.     // 2. 截图测试
  911.     log("[演示] 执行截图测试...");
  912.     var testImage = ScreenManager.captureFull();
  913.     if (testImage) {
  914.         log("[演示] ✓ 截图成功");
  915.         testImage.close();
  916.     }
  917.    
  918.     // 3. 快捷操作演示
  919.     log("[演示] 点击屏幕中心...");
  920.     ClickManager.clickPercent(0.5, 0.5);
  921.    
  922.     sleep(1000);
  923.    
  924.     log("[演示] 双击屏幕中心...");
  925.     ClickManager.doubleClick(0.5, 0.5);
  926.    
  927.     separator();
  928.     log("[演示] 功能演示完成!");
  929.     log("[提示] 请打开控制面板进行更多操作");
  930.     separator();
  931. }

  932. /**
  933. * 主函数 - 启动应用
  934. */
  935. function main() {
  936.     try {
  937.         // 运行演示
  938.         runDemo();
  939.         
  940.         // 启动控制面板
  941.         log("[系统] 正在启动控制面板...");
  942.         createControlPanel();
  943.         
  944.         log("[系统] ✓ 系统启动成功");
  945.         
  946.     } catch (e) {
  947.         log("[致命错误] 系统启动失败:" + e);
  948.     }
  949. }

  950. // ==================== 执行主程序 ====================
  951. main();
复制代码




unto安卓H5互动config配置调取存入示例nextnocontent
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读了
    采集亚马逊正版群发工具有没有?
    Apr.20旅行X心语今天来说说YYPOST新功能的一个灵活用法,采集亚马逊商品信息,并且获得排名的软件,亚马逊现在越来越多客户做,淘宝的水是越来越清了,以前做电商的客户,现在都转战到外国,最赚钱的要数一些客户往亚马逊里堆了吧,拿我这个YYPOST的客户,最多的是采集,分析排名,刷价格,刷数量,改价,刷访问量等等技术

    企业发展B2B网站有什么东东软件可以发呢
    标题企业发展网B2B软件,现在虽然B2B网站收录不错,可愁的是心急的人们,他们太想一口吃撑胖子了,发帖宣传虽然不能像佛系那样淡定,但也不能像跑火车那般急躁对待,自己内容不收录,完全是自己操作内容问题,可以参考一下别人的内容是怎么弄的,然后自己要试着转变,而且收录这个内容,常常会变化的,不是一种规则就吃到老

    搜房天下房聊软件哪一个好呢
    本帖最后由 发帖软件 于 2019-5-22 16:15 编辑 2搜房天下群发房聊信息软件,开始本来打算做58同城的,但发一个就要一次点触验证码,这就让人没有感觉到存在的价值了吧,都是卖二手房和新房的搜房天下倒是可以发即时聊天信息,也没有发现他这个网站有啥子限制,登陆一个搜房天下账号,然后采集回来分类列表的网址,然后就一

    大家坛有没有好用的群发工具下载呢
    当你的笑容给我礼貌的招呼,大家坛全自动发帖软件,宣传推广是一场持久战,总是有一些人把软件用了一天,或是几个小时,就觉得自己付出太多了,那加进来的粉丝,或是流量,应该是和宣传多少成正比的,其实没有这么便宜的事,就像很多阅读量超过一百万的视频,或是电影,真正会在屏幕打赏的人不会超过三千,真正大额打赏给主

    群发正版软件中国塑料网
    中国塑料网群发软件YYPOST脚本下载地址,这个网站会有一个很奇怪的问题就是你在首页登陆无半个验证码,但在登陆网址登陆就会有一个验证码,所以我们灵活一些,在首页登陆就不用输入验证码了哈。网站秒收录比较高,但发的都是五金和建筑行业,先前有很多人都是发土建工程的大公司操作的,现在这个网站专为那个行业诞生的吧。

    OpenStreetMap网站正版2019年发帖工具下载
    本帖最后由 发帖软件 于 2019-5-21 11:13 编辑 OpenStreetMap网站全自动群发,OpenStreetMapOpenStreetMap(简称OSM,中文是公开地图)是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图。有的人编辑地图然后等收录,有的人发日志等收录,我们这里也是利用地图日志做为宣传的目标,简单的脚本理

    搜房天下全自动收短信全自动识别验证码注册账号软件
    房天下自动注册机,这个脚本是前几天发房聊的脚本廷伸品种,这个脚本能做到自动注册账号,自动保存账号,自动发房聊的效果,不过今天我们主要说一说怎么注册账号写脚本吧,这个搜房天天下的账号,可以发提问,可以发房聊,发论坛,发博客,还有发个人中心页都是有秒收的效果的,这样就省去了去买号,去乱花钱的效果了吧,而

    企业邮箱安卓端有什么APP软件可以发的呢
    请输入标题企业邮箱安卓发发送邮箱脚本,这个脚本是利用企业邮箱进行群发的,全程是一种模拟手工操作的过程,所以封号是很少的,而且企业邮箱群发到普通QQ邮箱不容易进垃圾箱中的,所以这个脚本也是这样的原理,不过最好是利用一些多开器,登陆多点的QQ邮箱账号会比较流畅一些,然后用软件一个一个的切换APP进行群发邮件会

    头条留评论软件有没有好用的呢?
    今天整一个今日头条留言软件,对于留言YYPOST是优势是比较大的存在,因为他往往专注一些下拉定位的优点,像今日头条这样,还是需要一些特殊下拉定位的,因为他新闻有长有短,有图有视频的,所以综合起来定位是比较难的,如果用POST也不是很轻松可以破解他的加密参数。这个脚本也是有一个不好的地方就是换号会比较麻烦,您电

    单网页生成神器
    最近新技术,网页生成机占领了整个网络的半壁江山,效果很疯狂,虽然不知道能持续多久,作为开发软件的领头者,一直在找收录的方法,一直在努力创新着,一直被人模仿,却从没有被超越过,这个网页生成机,已经出来有一段时间了,一直没有拿出来分享,醉过醉过,它是利用的一些小小收录漏洞整的,您最好用一些老站域名,进行

关闭
快速回复 返回列表 返回顶部
本站自动发贴软件,是现在最流行的做脚本软件,这种发贴工具,不但发贴收录快,而且抢占好的先机,完全自由编辑,实现针对性群发模拟操作,软件可以顶贴,也可以发贴,可以兼容支持Discuz、PHPWind、Dvbbs三大主流论坛,有手机验证码收件,邮件收发的功能,支持验证码识别,注册问题识别,多线程任务,自动上传头像,自动激活注册邮件,兼容防注册插件,本站软件原创正版,更新效率最快的原创软件。 『网络推广软件』『自动发帖软件』『 自动发帖