M8Test Help

在脚本中使用

显示日志

import com.m8test.script.GlobalVariables.* import com.m8test.script.core.api.display.Display /** * 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 * * @return */ fun getDisplay(): Display { val allDisplays = _displays.getAll() if (allDisplays.isNotEmpty()) return allDisplays[0] // 创建虚拟屏幕, create 方法会返回一个 Display 对象 return _displays.create { // 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 } } val display = getDisplay() // 显示日志悬浮窗口,该悬浮窗仅会显示当前脚本运行时产生的日志 val consoleWindow = _floatingWindows.showConsole { // 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 setDisplayId(display.getId()) } // 设置窗口不可以点击, 防止窗口影响自动化操作 consoleWindow.getWindowBridge().setTouchable(false) // 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 _threads.getMain().setBackground(true) // 打印日志,可以在悬浮窗中看到输出 _console.log("测试日志悬浮窗")
import com.m8test.script.core.api.display.Display /** * 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 * * @return */ Display getDisplay() { def allDisplays = $displays.getAll() if (allDisplays.size() > 0) return allDisplays.get(0) // 创建虚拟屏幕, create 方法会返回一个 Display 对象 return $displays.create { config -> // 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 } } def display = getDisplay() // 显示日志悬浮窗口,该悬浮窗仅会显示当前脚本运行时产生的日志 def consoleWindow = $floatingWindows.showConsole { config -> // 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config.setDisplayId(display.getId()) } // 设置窗口不可以点击, 防止窗口影响自动化操作 consoleWindow.getWindowBridge().setTouchable(false) // 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 $threads.getMain().setBackground(true) // 打印日志,可以在悬浮窗中看到输出 $console.log("测试日志悬浮窗")
import com.m8test.script.core.api.display.Display; import com.m8test.script.core.api.floating.FloatingWindow; import com.m8test.script.core.api.floating.WindowConfig; import kotlin.jvm.functions.Function1; import java.util.List; import static com.m8test.script.GlobalVariables.*; /** * 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 * * @return */ static Display getDisplay() { List<Display> allDisplays = $displays.getAll(); if (allDisplays.size() > 0) return (Display) allDisplays.get(0); // 创建虚拟屏幕, create 方法会返回一个 Display 对象 return $displays.create(new Function1() { @Override public Object invoke(Object config) { // 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 return null; } }); } final Display display = getDisplay(); // 显示日志悬浮窗口,该悬浮窗仅会显示当前脚本运行时产生的日志 FloatingWindow consoleWindow = $floatingWindows.showConsole(new Function1() { @Override public Object invoke(Object windowConfig) { WindowConfig config = (WindowConfig) windowConfig; // 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config.setDisplayId(display.getId()); return null; } }); // 设置窗口不可以点击, 防止窗口影响自动化操作 consoleWindow.getWindowBridge().setTouchable(false); // 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 $threads.getMain().setBackground(true); // 打印日志,可以在悬浮窗中看到输出 $console.log("测试日志悬浮窗");
/** * 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 * * @returns {Packages.com.m8test.script.core.api.display.Display} */ function getDisplay() { let allDisplays = $displays.getAll() if (allDisplays.size() > 0) return allDisplays.get(0) // 创建虚拟屏幕, create 方法会返回一个 Display 对象 return $displays.create(function (config) { // 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 }) } let display = getDisplay() // 显示日志悬浮窗口,该悬浮窗仅会显示当前脚本运行时产生的日志 let consoleWindow = $floatingWindows.showConsole(function (config) { // 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config.setDisplayId(display.getId()) }); // 设置窗口不可以点击, 防止窗口影响自动化操作 consoleWindow.getWindowBridge().setTouchable(false) // 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 $threads.getMain().setBackground(true) // 打印日志,可以在悬浮窗中看到输出 $console.log("测试日志悬浮窗")
-- 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 --- @return m8test_java.com.m8test.script.core.api.display.Display function getDisplay() local allDisplays = _displays:getAll() if not allDisplays:isEmpty() then return allDisplays:get(0) else return _displays:create(function(config) -- 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 end) end end -- 获取一个虚拟屏幕 local display = getDisplay() -- 显示日志悬浮窗口,该悬浮窗仅会显示当前脚本运行时产生的日志 local consoleWindow = _floatingWindows:showConsole(function(config) -- 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config:setDisplayId(display:getId()) end) -- 设置窗口不可以点击, 防止窗口影响自动化操作 consoleWindow:getWindowBridge():setTouchable(false) -- 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 _threads:getMain():setBackground(true) -- 打印日志,可以在悬浮窗中看到输出 _console:log("测试日志悬浮窗")
<?php /** @var m8test_java\com\m8test\script\core\api\display\Displays $displays */ global $displays; /** * 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 * @param \m8test_java\com\m8test\script\core\api\display\Displays $displays * @return \m8test_java\com\m8test\script\core\api\display\Display */ function getDisplay($displays) { $allDisplays = $displays->getAll(); if ($allDisplays->size() > 0) { return $allDisplays->get(0); } else { return $displays->create(function ($config) { // 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 }); } } // 获取一个虚拟屏幕 $display = getDisplay($displays); /** @var m8test_java\com\m8test\script\core\api\floating\FloatingWindows $floatingWindows */ global $floatingWindows; // 显示日志悬浮窗口,该悬浮窗仅会显示当前脚本运行时产生的日志 $consoleWindow = $floatingWindows->showConsole(function ($config) use ($display) { // 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 $config->setDisplayId($display->getId()); }); // 设置窗口不可以点击, 防止窗口影响自动化操作 $consoleWindow->getWindowBridge()->setTouchable(false); /** @var m8test_java\com\m8test\script\core\api\thread\Threads $threads */ global $threads; // 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 $threads->getMain()->setBackground(true); /** @var m8test_java\com\m8test\script\core\api\console\Console $console */ global $console; // 打印日志,可以在悬浮窗中看到输出 $console->log(javaString("测试日志悬浮窗"));
from m8test_java.com.m8test.script.GlobalVariables import _console from m8test_java.com.m8test.script.GlobalVariables import _displays from m8test_java.com.m8test.script.GlobalVariables import _floatingWindows from m8test_java.com.m8test.script.GlobalVariables import _threads # 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 def getDisplay(): allDisplays = _displays.getAll() if allDisplays.size() > 0: return allDisplays.get(0) else: return _displays.create(lambda config: # 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 config) # 获取一个虚拟屏幕 display = getDisplay() # 显示日志悬浮窗口,该悬浮窗仅会显示当前脚本运行时产生的日志 consoleWindow = _floatingWindows.showConsole(lambda config: # 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config.setDisplayId(display.getId())) # 设置窗口不可以点击, 防止窗口影响自动化操作 consoleWindow.getWindowBridge().setTouchable(False) # 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 _threads.getMain().setBackground(True) # 打印日志,可以在悬浮窗中看到输出 _console.log("测试日志悬浮窗")
# encoding: utf-8 java_import 'com.m8test.script.core.api.display.Display' # 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 # @return [Display] 已存在或者新创建的虚拟屏幕 def getDisplay allDisplays = $displays.getAll if allDisplays.size > 0 allDisplays.get(0) else $displays.create { |config| # 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 } end end # 获取一个虚拟屏幕 display = getDisplay() # 显示日志悬浮窗口,该悬浮窗仅会显示当前脚本运行时产生的日志 consoleWindow = $floatingWindows.showConsole { |config| # 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config.setDisplayId(display.getId()) } # 设置窗口不可以点击, 防止窗口影响自动化操作 consoleWindow.getWindowBridge().setTouchable(false) # 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 $threads.getMain().setBackground(true) # 打印日志,可以在悬浮窗中看到输出 $console.log("测试日志悬浮窗")

显示Android视图

package com.example.script import android.widget.TextView import com.m8test.script.GlobalVariables.* import com.m8test.script.core.api.display.Display /** * 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 * * @return */ fun getDisplay(): Display { val allDisplays = _displays.getAll() if (allDisplays.isNotEmpty()) return allDisplays[0] // 创建虚拟屏幕, create 方法会返回一个 Display 对象 return _displays.create { // 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 } } val display = getDisplay() // 在悬浮窗口显示android视图 val floatingWindow = _floatingWindows.showView({ val textView = TextView(context) textView.text = "悬浮窗视图" addView(textView) }) { // 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 setDisplayId(display.getId()) } // 设置窗口不可以点击, 防止窗口影响自动化操作 floatingWindow.getWindowBridge().setTouchable(false) // 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 _threads.getMain().setBackground(true)
import android.widget.TextView import com.m8test.script.core.api.display.Display /** * 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 * * @return */ Display getDisplay() { def allDisplays = $displays.getAll() if (allDisplays.size() > 0) return allDisplays.get(0) // 创建虚拟屏幕, create 方法会返回一个 Display 对象 return $displays.create { config -> // 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 } } def display = getDisplay() // 在悬浮窗口显示android视图 def floatingWindow = $floatingWindows.showView({ frameLayout -> def textView = new TextView(frameLayout.getContext()) textView.setText("悬浮窗视图") frameLayout.addView(textView) }) { config -> // 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config.setDisplayId(display.getId()) } // 设置窗口不可以点击, 防止窗口影响自动化操作 floatingWindow.getWindowBridge().setTouchable(false) // 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 $threads.getMain().setBackground(true)
import android.widget.FrameLayout; import android.widget.TextView; import com.m8test.script.core.api.display.Display; import com.m8test.script.core.api.floating.FloatingWindow; import com.m8test.script.core.api.floating.WindowConfig; import kotlin.jvm.functions.Function1; import java.util.List; import static com.m8test.script.GlobalVariables.*; /** * 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 * * @return */ static Display getDisplay() { List<Display> allDisplays = $displays.getAll(); if (allDisplays.size() > 0) return (Display) allDisplays.get(0); // 创建虚拟屏幕, create 方法会返回一个 Display 对象 return $displays.create(new Function1() { @Override public Object invoke(Object config) { // 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 return null; } }); } final Display display = getDisplay(); // 在悬浮窗口显示android视图 FloatingWindow floatingWindow = $floatingWindows.showView(new Function1() { @Override public Object invoke(Object o) { FrameLayout frameLayout = (FrameLayout) o; TextView textView = new TextView(frameLayout.getContext()); textView.setText("悬浮窗视图"); frameLayout.addView(textView); return null; } }, new Function1() { @Override public Object invoke(Object o) { WindowConfig config = (WindowConfig) o; // 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config.setDisplayId(display.getId()); return null; } }); // 设置窗口不可以点击, 防止窗口影响自动化操作 floatingWindow.getWindowBridge().setTouchable(false); // 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 $threads.getMain().setBackground(true);
/** * 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 * * @returns {Packages.com.m8test.script.core.api.display.Display} */ function getDisplay() { let allDisplays = $displays.getAll() if (allDisplays.size() > 0) return allDisplays.get(0) // 创建虚拟屏幕, create 方法会返回一个 Display 对象 return $displays.create(function (config) { // 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 }) } let display = getDisplay() // 在悬浮窗口显示android视图 let floatingWindow = $floatingWindows.showView(function (frameLayout) { let textView = new Packages.android.widget.TextView(frameLayout.getContext()) textView.setText("悬浮窗视图") frameLayout.addView(textView) }, function (config) { // 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config.setDisplayId(display.getId()) }) // 设置窗口不可以点击, 防止窗口影响自动化操作 floatingWindow.getWindowBridge().setTouchable(false) // 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 $threads.getMain().setBackground(true)
-- 引入 TextView 类, 必须以 m8test_java 开头, 后面跟 java 类名 local TextView = require("m8test_java.android.widget.TextView") -- 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 --- @return m8test_java.com.m8test.script.core.api.display.Display function getDisplay() local allDisplays = _displays:getAll() if not allDisplays:isEmpty() then return allDisplays:get(0) else return _displays:create(function(config) -- 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 end) end end -- 获取一个虚拟屏幕 local display = getDisplay() -- 在悬浮窗口显示android视图 local floatingWindow = _floatingWindows:showView(function(frameLayout) local textView = TextView:newJavaObject(frameLayout:getContext()) textView:setText("悬浮窗视图") frameLayout:addView(textView) end, function(config) -- 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config:setDisplayId(display:getId()) end) -- 设置窗口不可以点击, 防止窗口影响自动化操作 floatingWindow:getWindowBridge():setTouchable(false) -- 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 _threads:getMain():setBackground(true)
<?php use m8test_java\android\widget\TextView; /** @var m8test_java\com\m8test\script\core\api\display\Displays $displays */ global $displays; /** * 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 * @param \m8test_java\com\m8test\script\core\api\display\Displays $displays * @return \m8test_java\com\m8test\script\core\api\display\Display */ function getDisplay($displays) { $allDisplays = $displays->getAll(); if ($allDisplays->size() > 0) { return $allDisplays->get(0); } else { return $displays->create(function ($config) { // 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 }); } } // 获取一个虚拟屏幕 $display = getDisplay($displays); /** @var m8test_java\com\m8test\script\core\api\floating\FloatingWindows $floatingWindows */ global $floatingWindows; // 在悬浮窗口显示android视图 $floatingWindow = $floatingWindows->showView(function ($frameLayout) { $textView = new TextView($frameLayout->getContext()); $textView->setText(javaString("悬浮窗视图")); $frameLayout->addView($textView); }, function ($config) use ($display) { // 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 $config->setDisplayId($display->getId()); }); // 设置窗口不可以点击, 防止窗口影响自动化操作 $floatingWindow->getWindowBridge()->setTouchable(false); /** @var m8test_java\com\m8test\script\core\api\thread\Threads $threads */ global $threads; // 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 $threads->getMain()->setBackground(true);
from m8test_java.com.m8test.script.GlobalVariables import _displays from m8test_java.com.m8test.script.GlobalVariables import _floatingWindows from m8test_java.com.m8test.script.GlobalVariables import _threads # 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 def getDisplay(): allDisplays = _displays.getAll() if allDisplays.size() > 0: return allDisplays.get(0) else: return _displays.create(lambda config: # 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 config) # 获取一个虚拟屏幕 display = getDisplay() from m8test_java.android.widget.TextView import TextView from m8test_java.android.widget.FrameLayout import FrameLayout def viewContent(frameLayout: FrameLayout): textView = TextView(frameLayout.getContext()) textView.setText("悬浮窗视图") frameLayout.addView(textView) # 在悬浮窗口显示android视图 floatingWindow = _floatingWindows.showView(viewContent, lambda config: # 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config.setDisplayId(display.getId())) # 设置窗口不可以点击, 防止窗口影响自动化操作 floatingWindow.getWindowBridge().setTouchable(False) # 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 _threads.getMain().setBackground(True)
# encoding: utf-8 java_import 'com.m8test.script.core.api.display.Display' # 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 # @return [Display] 已存在或者新创建的虚拟屏幕 def getDisplay allDisplays = $displays.getAll if allDisplays.size > 0 allDisplays.get(0) else $displays.create { |config| # 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 } end end # 获取一个虚拟屏幕 display = getDisplay() java_import "android.widget.FrameLayout" java_import "android.widget.TextView" # 在悬浮窗口显示android视图 floatingWindow = $floatingWindows.showView(lambda { # @type frameLayout [FrameLayout] |frameLayout| textView = TextView.new(frameLayout.getContext()) textView.setText("悬浮窗视图") frameLayout.addView(textView) }) { |config| # 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config.setDisplayId(display.getId()) } # 设置窗口不可以点击, 防止窗口影响自动化操作 floatingWindow.getWindowBridge().setTouchable(false) # 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 $threads.getMain().setBackground(true)

显示 WebView

package com.example.script import com.m8test.script.GlobalVariables.* import com.m8test.script.core.api.display.Display /** * 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 * * @return */ fun getDisplay(): Display { val allDisplays = _displays.getAll() if (allDisplays.isNotEmpty()) return allDisplays[0] // 创建虚拟屏幕, create 方法会返回一个 Display 对象 return _displays.create { // 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 } } val display = getDisplay() // 在悬浮窗口中显示WebView内容, 第一个参数为要加载的内容URI,可以是网络URL或本地HTML文件路径 本地文件路径相对于脚本项目的webview目录 val floatingWindow = _floatingWindows.showWebView("https://www.m8test.com") { // 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 setDisplayId(display.getId()) } // 设置窗口不可以点击, 防止窗口影响自动化操作 floatingWindow.getWindowBridge().setTouchable(false) // 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 _threads.getMain().setBackground(true)
import com.m8test.script.core.api.display.Display /** * 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 * * @return */ Display getDisplay() { def allDisplays = $displays.getAll() if (allDisplays.size() > 0) return allDisplays.get(0) // 创建虚拟屏幕, create 方法会返回一个 Display 对象 return $displays.create { config -> // 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 } } def display = getDisplay() // 在悬浮窗口中显示WebView内容, 第一个参数为要加载的内容URI,可以是网络URL或本地HTML文件路径 本地文件路径相对于脚本项目的webview目录 def floatingWindow = $floatingWindows.showWebView("https://www.m8test.com") { config -> // 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config.setDisplayId(display.getId()) } // 设置窗口不可以点击, 防止窗口影响自动化操作 floatingWindow.getWindowBridge().setTouchable(false) // 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 $threads.getMain().setBackground(true)
import com.m8test.script.core.api.display.Display; import com.m8test.script.core.api.floating.FloatingWindow; import com.m8test.script.core.api.floating.WindowConfig; import kotlin.jvm.functions.Function1; import java.util.List; import static com.m8test.script.GlobalVariables.*; /** * 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 * * @return */ static Display getDisplay() { List<Display> allDisplays = $displays.getAll(); if (allDisplays.size() > 0) return (Display) allDisplays.get(0); // 创建虚拟屏幕, create 方法会返回一个 Display 对象 return $displays.create(new Function1() { @Override public Object invoke(Object config) { // 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 return null; } }); } final Display display = getDisplay(); // 在悬浮窗口中显示WebView内容, 第一个参数为要加载的内容URI,可以是网络URL或本地HTML文件路径 本地文件路径相对于脚本项目的webview目录 FloatingWindow floatingWindow = $floatingWindows.showWebView("https://www.m8test.com", new Function1() { @Override public Object invoke(Object o) { WindowConfig config = (WindowConfig) o; // 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config.setDisplayId(display.getId()); return null; } }); // 设置窗口不可以点击, 防止窗口影响自动化操作 floatingWindow.getWindowBridge().setTouchable(false); // 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 $threads.getMain().setBackground(true);
/** * 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 * * @returns {Packages.com.m8test.script.core.api.display.Display} */ function getDisplay() { let allDisplays = $displays.getAll() if (allDisplays.size() > 0) return allDisplays.get(0) // 创建虚拟屏幕, create 方法会返回一个 Display 对象 return $displays.create(function (config) { // 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 }) } let display = getDisplay() // 在悬浮窗口中显示WebView内容, 第一个参数为要加载的内容URI,可以是网络URL或本地HTML文件路径 本地文件路径相对于脚本项目的webview目录 let floatingWindow = $floatingWindows.showWebView("https://www.m8test.com", function (config) { // 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config.setDisplayId(display.getId()) }) // 设置窗口不可以点击, 防止窗口影响自动化操作 floatingWindow.getWindowBridge().setTouchable(false) // 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 $threads.getMain().setBackground(true)
-- 引入 TextView 类, 必须以 m8test_java 开头, 后面跟 java 类名 local TextView = require("m8test_java.android.widget.TextView") -- 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 --- @return m8test_java.com.m8test.script.core.api.display.Display function getDisplay() local allDisplays = _displays:getAll() if not allDisplays:isEmpty() then return allDisplays:get(0) else return _displays:create(function(config) -- 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 end) end end -- 获取一个虚拟屏幕 local display = getDisplay() -- 在悬浮窗口中显示WebView内容, 第一个参数为要加载的内容URI,可以是网络URL或本地HTML文件路径 本地文件路径相对于脚本项目的webview目录 local floatingWindow = _floatingWindows:showWebView("https://www.m8test.com", function(config) -- 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config:setDisplayId(display:getId()) end) -- 设置窗口不可以点击, 防止窗口影响自动化操作 floatingWindow:getWindowBridge():setTouchable(false) -- 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 _threads:getMain():setBackground(true)
<?php use m8test_java\android\widget\TextView; /** @var m8test_java\com\m8test\script\core\api\display\Displays $displays */ global $displays; /** * 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 * @param \m8test_java\com\m8test\script\core\api\display\Displays $displays * @return \m8test_java\com\m8test\script\core\api\display\Display */ function getDisplay($displays) { $allDisplays = $displays->getAll(); if ($allDisplays->size() > 0) { return $allDisplays->get(0); } else { return $displays->create(function ($config) { // 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 }); } } // 获取一个虚拟屏幕 $display = getDisplay($displays); /** @var m8test_java\com\m8test\script\core\api\floating\FloatingWindows $floatingWindows */ global $floatingWindows; // 在悬浮窗口中显示WebView内容, 第一个参数为要加载的内容URI,可以是网络URL或本地HTML文件路径 本地文件路径相对于脚本项目的webview目录 $floatingWindow = $floatingWindows->showWebView("https://www.m8test.com", function ($config) use ($display) { // 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 $config->setDisplayId($display->getId()); }); // 设置窗口不可以点击, 防止窗口影响自动化操作 $floatingWindow->getWindowBridge()->setTouchable(false); /** @var m8test_java\com\m8test\script\core\api\thread\Threads $threads */ global $threads; // 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 $threads->getMain()->setBackground(true);
from m8test_java.com.m8test.script.GlobalVariables import _displays from m8test_java.com.m8test.script.GlobalVariables import _floatingWindows from m8test_java.com.m8test.script.GlobalVariables import _threads # 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 def getDisplay(): allDisplays = _displays.getAll() if allDisplays.size() > 0: return allDisplays.get(0) else: return _displays.create(lambda config: # 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 config) # 获取一个虚拟屏幕 display = getDisplay() # 在悬浮窗口中显示WebView内容, 第一个参数为要加载的内容URI,可以是网络URL或本地HTML文件路径 本地文件路径相对于脚本项目的webview目录 floatingWindow = _floatingWindows.showWebView("https://www.m8test.com", lambda config: # 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config.setDisplayId(display.getId())) # 设置窗口不可以点击, 防止窗口影响自动化操作 floatingWindow.getWindowBridge().setTouchable(False) # 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 _threads.getMain().setBackground(True)
# encoding: utf-8 java_import 'com.m8test.script.core.api.display.Display' # 获取一个虚拟屏幕,如果已经存在的话则直接使用原有的,否则创建一个 # @return [Display] 已存在或者新创建的虚拟屏幕 def getDisplay allDisplays = $displays.getAll if allDisplays.size > 0 allDisplays.get(0) else $displays.create { |config| # 这里可以配置虚拟屏幕,推荐直接使用默认配置,如果出错的话再手动配置 } end end # 获取一个虚拟屏幕 display = getDisplay() # 在悬浮窗口中显示WebView内容, 第一个参数为要加载的内容URI,可以是网络URL或本地HTML文件路径 本地文件路径相对于脚本项目的webview目录 floatingWindow = $floatingWindows.showWebView("https://www.m8test.com") { |config| # 设置悬浮窗显示的屏幕, 如果不设置默认显示在物理屏幕 config.setDisplayId(display.getId()) } # 设置窗口不可以点击, 防止窗口影响自动化操作 floatingWindow.getWindowBridge().setTouchable(false) # 为了看到效果让主线程在后台运行,因为脚本结束时会自动关闭所有脚本创建的悬浮窗 $threads.getMain().setBackground(true)
Last modified: 16 October 2025