上传备份

master
王兵 1 month ago
parent e2c12cf6a9
commit ca195e6985

@ -33,6 +33,11 @@ import java.util.concurrent.TimeUnit;
*/
public abstract class JMacro {
/**
*
*/
private boolean run;
/**
*
*/
@ -59,6 +64,14 @@ public abstract class JMacro {
}
}
public boolean isRun() {
return run;
}
public void setRun(boolean run) {
this.run = run;
}
public int getDefaultTimeOut() {
return defaultTimeOut;
}
@ -95,7 +108,30 @@ public abstract class JMacro {
/**
*
*/
public abstract void run();
public void start() {
if (this.run) {
Logger.error("脚本正在运行中");
return;
}
this.run = true;
this.task();
}
/**
*
*/
public abstract void task();
/**
*
*/
public void stop() {
if (!this.run) {
Logger.error("脚本未运行");
return;
}
this.run = false;
}
/**
*

@ -1,14 +1,20 @@
package xyz.wbsite.jmacro;
import cn.hutool.core.collection.BoundedPriorityQueue;
import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.StrUtil;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.Tooltip;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.util.Duration;
import xyz.wbsite.jmacro.base.Legend;
import xyz.wbsite.jmacro.base.ViewRect;
import xyz.wbsite.jmacro.tool.Measure;
@ -16,7 +22,6 @@ import xyz.wbsite.jmacro.tool.PickLegend;
import xyz.wbsite.jmacro.tool.PickPoint;
import xyz.wbsite.jmacro.tool.PickRect;
import xyz.wbsite.jmacro.util.DialogUtil;
import xyz.wbsite.jmacro.util.Logger;
import java.awt.*;
import java.net.URL;
@ -37,6 +42,8 @@ public class JMainController implements Initializable {
@FXML
private Button stop;
@FXML
private ImageView set;
@FXML
private Button capture;
@FXML
private ImageView preview;
@ -51,7 +58,7 @@ public class JMainController implements Initializable {
@Override
public void initialize(URL location, ResourceBundle resources) {
// 控件初始化
Logger.info("控件初始化完成");
installTip(set, "扩展配置");
}
/**
@ -180,4 +187,28 @@ public class JMainController implements Initializable {
console.appendText(format);
});
}
/**
*
*
* @param node
* @param tip
*/
public static void installTip(Node node, String tip) {
Tooltip tooltip = new Tooltip(tip);
try {
java.lang.reflect.Field behavior = ClassUtil.getDeclaredField(Tooltip.class, "BEHAVIOR");
behavior.setAccessible(true);
Object o = behavior.get(tooltip);
java.lang.reflect.Field activationTimer = ClassUtil.getDeclaredField(o.getClass(), "activationTimer");
activationTimer.setAccessible(true);
Timeline timeline = (Timeline) activationTimer.get(o);
timeline.getKeyFrames().remove(0);
timeline.getKeyFrames().add(new KeyFrame(new Duration(10)));
Tooltip.install(node, tooltip);
} catch (Exception e) {
}
}
}

@ -4,7 +4,6 @@ import cn.hutool.core.thread.ThreadUtil;
import xyz.wbsite.jmacro.base.Legend;
import xyz.wbsite.jmacro.util.DialogUtil;
import xyz.wbsite.jmacro.util.Logger;
import xyz.wbsite.jtask.TaskImpl;
import java.io.File;
@ -94,10 +93,14 @@ public class JMainService {
return false;
}
// 停止服务
Logger.info("停止服务");
// 关闭守护线程
JMainService.getInstance().run = false;
// 立即停止脚本
if (JMainService.getInstance().macro.isRun()) {
JMainService.getInstance().macro.stop();
}
// 关闭守护线程
JMainService.getInstance().daemonThread.interrupt();
Logger.info("停止服务");
return true;
}
@ -112,10 +115,10 @@ public class JMainService {
Logger.info("脚本未设置");
return;
}
while (run) {
while (run && !Thread.currentThread().isInterrupted()) {
try {
ThreadUtil.sleep(1000);
macro.run();
macro.start();
} catch (Exception e) {
if ((e instanceof InterruptedException) || e.getMessage().contains(InterruptedException.class.getSimpleName())) {
// 服务停止
@ -128,12 +131,4 @@ public class JMainService {
Logger.info("服务停止,守护线程已退出");
}
}
/**
*
*/
public static void main(String[] args) {
JMainService.init(new TaskImpl(), new File("legend"));
JMainService.start();
}
}

@ -1,6 +1,5 @@
package xyz.wbsite.jtask;
import cn.hutool.core.util.RandomUtil;
import xyz.wbsite.jmacro.JMacro;
import xyz.wbsite.jmacro.base.ViewRect;
import xyz.wbsite.jmacro.util.Logger;
@ -24,7 +23,7 @@ public class TaskImpl extends JMacro {
}
@Override
public void run() {
public void task() {
// 此处我们模拟一个简单的脚本
// 比如在window11打开我的电脑再关闭
Logger.info("启动任务");
@ -52,13 +51,11 @@ public class TaskImpl extends JMacro {
Logger.info("定位到我的电脑窗口");
Logger.info("移动鼠标");
mouseMove(windows.getCenter().offsetX(100), true);
mouseLeftClick(windows.getCenter().offsetX(100));
Logger.info("等待3秒后自动关闭");
delay(3 * 1000);
mouseLeftClick(windows.getCenter().offsetX(100));
Logger.info("结束任务");
int randomInt = RandomUtil.randomInt(5, 10);
Logger.info("随机休眠{}分钟", randomInt);
delay(randomInt * 60 * 1000);
}
}

@ -1,94 +1,118 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<AnchorPane prefHeight="300.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="xyz.wbsite.jmacro.JMainController" stylesheets="@main.css">
<children>
<Separator layoutY="-1.0" opacity="0.5" prefWidth="200.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
<VBox maxWidth="204.0" minWidth="204.0" prefWidth="204.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<Label contentDisplay="CENTER" prefHeight="35.0" text="服务控制">
<padding>
<Insets left="10.0" />
</padding>
</Label>
<HBox alignment="CENTER_LEFT" prefHeight="35.0" prefWidth="200.0">
<children>
<Button fx:id="start" focusTraversable="false" mnemonicParsing="false" onMouseClicked="#onStart" prefHeight="30.0" prefWidth="90.0" text="开始F1" />
<Button fx:id="stop" disable="true" focusTraversable="false" mnemonicParsing="false" onMouseClicked="#onStop" prefHeight="30.0" prefWidth="90.0" text="停止F2">
<HBox.margin>
<Insets left="10.0" />
</HBox.margin>
</Button>
</children>
</HBox>
<Label contentDisplay="CENTER" prefHeight="35.0" text="辅助工具">
<padding>
<Insets left="10.0" />
</padding>
</Label>
<HBox alignment="CENTER_LEFT" prefHeight="35.0">
<children>
<Button focusTraversable="false" mnemonicParsing="false" onMouseClicked="#pickPoint" prefHeight="30.0" prefWidth="50.0" text="采点" />
<Button focusTraversable="false" mnemonicParsing="false" onMouseClicked="#pickRect" prefHeight="30.0" prefWidth="50.0" text="采区">
<HBox.margin>
<Insets left="5.0" />
</HBox.margin>
</Button>
<Button focusTraversable="false" mnemonicParsing="false" onMouseClicked="#pickLegend" prefHeight="30.0" prefWidth="50.0" text="采图">
<HBox.margin>
<Insets left="5.0" />
</HBox.margin>
</Button>
<Button focusTraversable="false" mnemonicParsing="false" onMouseClicked="#measure" prefHeight="30.0" prefWidth="50.0" text="测距">
<HBox.margin>
<Insets left="5.0" />
</HBox.margin>
</Button>
</children>
</HBox>
<Label prefHeight="35.0" prefWidth="200.0" text="焦点预览">
<padding>
<Insets left="5.0" />
</padding>
<VBox.margin>
<Insets />
</VBox.margin>
</Label>
<AnchorPane maxHeight="108.0" maxWidth="192.0" minHeight="108.0" minWidth="192.0" prefHeight="108.0" prefWidth="192.0" style="-fx-border-color: #ddd;">
<children>
<ImageView fx:id="preview" pickOnBounds="true" preserveRatio="true" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<viewport>
<Rectangle2D height="100.0" width="188.0" />
</viewport>
</ImageView>
</children>
</AnchorPane>
</children>
<padding>
<Insets left="6.0" right="6.0" />
</padding>
</VBox>
<Separator opacity="0.5" orientation="VERTICAL" prefHeight="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="204.0" AnchorPane.topAnchor="0.0" />
<AnchorPane layoutX="262.0" layoutY="14.0" prefHeight="300.0" prefWidth="400.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="204.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<Label layoutY="4.0" prefHeight="40.0" prefWidth="60.0" text="定制功能" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<padding>
<Insets left="10.0" right="10.0" />
</padding>
</Label>
<Separator layoutX="-3.0" layoutY="39.0" opacity="0.5" prefWidth="200.0" AnchorPane.leftAnchor="1.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="41.0" />
<TextArea fx:id="console" editable="false" layoutX="1.0" layoutY="41.0" prefHeight="270.0"
style="-fx-background-color: transparent; -fx-focus-color: no; -fx-control-inner-background: transparent;-fx-text-fill: #444444;"
wrapText="true"
AnchorPane.leftAnchor="1.0"
AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="45.0">
<AnchorPane prefHeight="300.0" prefWidth="600.0" stylesheets="@main.css" xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="xyz.wbsite.jmacro.JMainController">
<children>
<Separator layoutY="-1.0" opacity="0.5" prefWidth="200.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
<VBox maxWidth="204.0" minWidth="204.0" prefWidth="204.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<HBox alignment="CENTER_LEFT" prefHeight="35.0" prefWidth="200.0">
<children>
<Button fx:id="start" focusTraversable="false" mnemonicParsing="false" onMouseClicked="#onStart" prefHeight="30.0" prefWidth="100.0" text="开始F1" />
<Button fx:id="stop" disable="true" focusTraversable="false" mnemonicParsing="false" onMouseClicked="#onStop" prefHeight="30.0" prefWidth="100.0" text="停止F2">
<HBox.margin>
<Insets left="10.0" />
</HBox.margin>
</Button>
</children>
</HBox>
<HBox alignment="CENTER_LEFT">
<children>
<Label contentDisplay="CENTER" prefHeight="25.0" text="执行选项" />
</TextArea>
</children>
</AnchorPane>
</children>
<ImageView fx:id="set" fitHeight="12.0" fitWidth="12.0" preserveRatio="true">
<image>
<Image url="@set.png" />
</image>
<HBox.margin>
<Insets left="5.0" />
</HBox.margin>
<cursor>
<Cursor fx:constant="HAND" />
</cursor>
</ImageView>
</children>
</HBox>
<HBox alignment="CENTER_LEFT" prefHeight="25.0" prefWidth="200.0">
<children>
<Label text="每" />
<TextField alignment="CENTER" prefWidth="35.0" promptText="时间" text="60">
<HBox.margin>
<Insets left="3.0" right="3.0" />
</HBox.margin>
</TextField>
<Label text="秒执行1次" />
<Label text="共" />
<TextField alignment="CENTER" prefWidth="35.0" promptText="次数" text="1">
<HBox.margin>
<Insets left="3.0" right="3.0" />
</HBox.margin>
</TextField>
<Label text="次" />
</children>
</HBox>
<Label contentDisplay="CENTER" prefHeight="25.0" text="辅助工具" />
<HBox alignment="CENTER_LEFT" prefHeight="35.0">
<children>
<Button focusTraversable="false" mnemonicParsing="false" onMouseClicked="#pickPoint" prefHeight="25.0" prefWidth="50.0" text="采点" />
<Button focusTraversable="false" mnemonicParsing="false" onMouseClicked="#pickRect" prefHeight="25.0" prefWidth="50.0" text="采区">
<HBox.margin>
<Insets left="5.0" />
</HBox.margin>
</Button>
<Button focusTraversable="false" mnemonicParsing="false" onMouseClicked="#pickLegend" prefHeight="25.0" prefWidth="50.0" text="采图">
<HBox.margin>
<Insets left="5.0" />
</HBox.margin>
</Button>
<Button focusTraversable="false" mnemonicParsing="false" onMouseClicked="#measure" prefHeight="25.0" prefWidth="50.0" text="测距">
<HBox.margin>
<Insets left="5.0" />
</HBox.margin>
</Button>
</children>
</HBox>
<Label prefHeight="25.0" prefWidth="204.0" text="焦点预览" />
<AnchorPane maxHeight="108.0" maxWidth="192.0" minHeight="108.0" minWidth="192.0" prefHeight="108.0" prefWidth="192.0" style="-fx-border-color: #ddd;">
<children>
<ImageView fx:id="preview" pickOnBounds="true" preserveRatio="true" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<viewport>
<Rectangle2D height="100.0" width="188.0" />
</viewport>
</ImageView>
</children>
</AnchorPane>
<Label alignment="CENTER" contentDisplay="CENTER" prefHeight="35.0" prefWidth="188.0" text="©2025 一团芝麻糊" />
</children>
<padding>
<Insets left="6.0" right="6.0" />
</padding>
</VBox>
<Separator opacity="0.5" orientation="VERTICAL" prefHeight="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="204.0" AnchorPane.topAnchor="0.0" />
<AnchorPane layoutX="262.0" layoutY="14.0" prefHeight="250.0" prefWidth="400.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="204.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<Label layoutY="4.0" prefHeight="40.0" prefWidth="60.0" text="日志输出" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<padding>
<Insets left="10.0" right="10.0" />
</padding>
</Label>
<Separator layoutX="-3.0" layoutY="39.0" opacity="0.5" prefWidth="200.0" AnchorPane.leftAnchor="1.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="41.0" />
<TextArea fx:id="console" editable="false" layoutX="1.0" layoutY="41.0" prefHeight="270.0" style="-fx-background-color: transparent; -fx-focus-color: no; -fx-control-inner-background: transparent;-fx-text-fill: #444444;" wrapText="true" AnchorPane.leftAnchor="1.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="45.0">
</TextArea>
</children>
</AnchorPane>
</children>
</AnchorPane>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Loading…
Cancel
Save

Powered by TurnKey Linux.