在脚本中使用
显示日志
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