Java入坑之Robot类
一、概述
1.1Robot类概述
在Java中,Robot是一个属于java.awt包的类。它还扩展了 Object 类。该类用于为测试自动化、自运行演示以及需要控制鼠标和键盘的其他应用程序生成本机系统输入事件。换句话说,我们使用 Java Robot 类来触发输入事件,例如鼠标单击、按键等。
可以用于测试自动化、自运行演示或其他需要控制鼠标和键盘的应用程序
1.2常用方法
| 方法名称 | 描述 |
|---|---|
| createScreenCapture(Rectangle screenRect) 创建屏幕捕获(矩形屏幕矩形) | 该方法以矩形从屏幕捕获图像。 |
| delay(int ms) 延迟(整数毫秒) | 它用于睡眠指定的时间。 |
| getAutoDelay() | 它返回此机器人在生成事件后休眠的毫秒数。 |
| getPixelColor(int x, int y) | 它返回指定坐标的像素的颜色。 |
| isAutoWaitForIdle() | 该方法返回此机器人在生成事件后是否自动调用 waitForIdle()。 |
| keyPress(int keycode) 按键(整数键代码) | 该方法按特定键。 |
| keyRelease(int keycode) | 它释放指定的密钥。 |
| mouseMove(int x, int y) | 它将鼠标指针移到指定的坐标上。 |
| keyPress(int keycode) 鼠标按下(整数按钮) | 它按下鼠标按钮。 |
| mouseRelease(int buttons) 鼠标释放(整数按钮) | 该方法释放鼠标按钮。 |
| mouseWheel(int wheelAmt) | 它会滚动鼠标滚轮。 |
| mouseRelease(int buttons) 设置自动延迟(整数毫秒) | 它设置此机器人在生成事件后休眠的毫秒数。 |
| setAutoWaitForIdle(boolean isOn) | 它设置此机器人在生成事件后是否自动调用 waitForIdle() 方法。 |
| toString() | 它返回机器人的字符串表示形式。 |
| waitForIdle() | 它会等待,直到当前事件队列上的所有事件都已处理完毕。 |
1.3代码演示
这段代码的主要作用是打开记事本应用程序,然后使用Robot类模拟键盘输入一系列字符,每个字符之间暂停500毫秒。这个示例可以用于演示如何使用Java程序来控制键盘输入
package org.example;import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.io.*;public class KeyBoardControlExample {public static void main(String args[]) throws IOException, AWTException, InterruptedException {// 定义要执行的命令,这里是打开记事本String command = "notepad.exe";Runtime run = Runtime.getRuntime();// 执行操作系统命令,启动记事本应用程序run.exec(command);try {// 延迟等待4秒(4000毫秒),以确保记事本程序完全启动Thread.sleep(4000);} catch (InterruptedException e) {// 处理中断异常e.printStackTrace();}// 创建Robot类的实例,用于模拟键盘输入Robot robot = new Robot();// 模拟按下键盘上的各个键,每个键按下后等待500毫秒robot.keyPress(KeyEvent.VK_W); // 按下 'W'Thread.sleep(500);robot.keyPress(KeyEvent.VK_E); // 按下 'E'Thread.sleep(500);robot.keyPress(KeyEvent.VK_L); // 按下 'L'Thread.sleep(500);robot.keyPress(KeyEvent.VK_C); // 按下 'C'Thread.sleep(500);robot.keyPress(KeyEvent.VK_O); // 按下 'O'Thread.sleep(500);robot.keyPress(KeyEvent.VK_M); // 按下 'M'Thread.sleep(500);robot.keyPress(KeyEvent.VK_E); // 按下 'E'Thread.sleep(500);robot.keyPress(KeyEvent.VK_SPACE); // 按下空格键Thread.sleep(500);robot.keyPress(KeyEvent.VK_T); // 按下 'T'Thread.sleep(500);robot.keyPress(KeyEvent.VK_O); // 按下 'O'Thread.sleep(500);robot.keyPress(KeyEvent.VK_SPACE); // 按下空格键Thread.sleep(500);robot.keyPress(KeyEvent.VK_J); // 按下 'J'Thread.sleep(500);robot.keyPress(KeyEvent.VK_A); // 按下 'A'Thread.sleep(500);robot.keyPress(KeyEvent.VK_V); // 按下 'V'Thread.sleep(500);robot.keyPress(KeyEvent.VK_A); // 按下 'A'Thread.sleep(500);robot.keyPress(KeyEvent.VK_T); // 按下 'T'Thread.sleep(500);robot.keyPress(KeyEvent.VK_P); // 按下 'P'Thread.sleep(500);robot.keyPress(KeyEvent.VK_O); // 按下 'O'Thread.sleep(500);robot.keyPress(KeyEvent.VK_I); // 按下 'I'Thread.sleep(500);robot.keyPress(KeyEvent.VK_N); // 按下 'N'Thread.sleep(500);robot.keyPress(KeyEvent.VK_T); // 按下 'T'Thread.sleep(500);}
}
代码优化
package org.example;import java.awt.*;
import java.awt.event.KeyEvent;class Robo {// 自定义休眠方法public static void sleep(long ms) {try {Thread.sleep(ms);} catch (Exception ignored) {}}public static void main(String[] args) throws Exception {// 打开记事本应用程序Runtime.getRuntime().exec("notepad.exe");// 等待2秒sleep(2000);// 创建Robot类的实例Robot robot = new Robot();// 要输入的字符串String str = "Hello from GeeksforGeeks";// 使用Robot模拟按键操作// 每次按键之间间隔200毫秒for (int i = 0; i < str.length(); i++) {// 检查当前字符是否是大写字母if (Character.isUpperCase(str.charAt(i))) {// 按下Shift键robot.keyPress(KeyEvent.VK_SHIFT);// 按下当前字符的大写形式robot.keyPress(Character.toUpperCase(str.charAt(i)));// 释放Shift键robot.keyRelease(KeyEvent.VK_SHIFT);}// 否则按下字符本身elserobot.keyPress(Character.toUpperCase(str.charAt(i)));// 等待200毫秒sleep(200);}}
}
1.4应用场景
- 测试自动化:Robot类可以模拟用户的鼠标和键盘操作,对软件或网页进行自动化的测试,检查其功能和性能是否正常。例如,Robot类可以用来测试Java Swing组件的交互效果¹。
- 自运行演示:Robot类可以用来制作一些自动运行的演示程序,展示软件或网页的功能和特点。例如,Robot类可以用来制作一个自动在画板上画图的演示程序²。
- 游戏辅助:Robot类可以用来开发一些游戏辅助工具,通过分析屏幕上的像素颜色和位置,控制鼠标和键盘进行游戏操作。例如,Robot类可以用来实现一个“别踩白块”游戏的辅助程序³。
二、键盘事件
Java中的Robot类可以用于模拟各种键盘事件,包括按下键、释放键和键盘字符事件。以下是一些常见的键盘事件以及如何使用Robot类模拟它们:
2.1按下键:
要模拟按下键盘上的某个键,您可以使用keyPress方法,并传递一个表示键的常量,例如KeyEvent.VK_KEY,其中"KEY"是要模拟的键的名称。例如,模拟按下"A"键:
import java.awt.*;
import java.awt.event.KeyEvent;public class KeyPressExample {public static void main(String[] args) throws AWTException {Robot robot = new Robot();robot.keyPress(KeyEvent.VK_A); // 按下"A"键}
}
2.2释放键:
要模拟释放键盘上的某个键,您可以使用keyRelease方法,也需要传递表示键的常量。例如,模拟释放"A"键:
import java.awt.*;
import java.awt.event.KeyEvent;public class KeyReleaseExample {public static void main(String[] args) throws AWTException {Robot robot = new Robot();robot.keyRelease(KeyEvent.VK_A); // 释放"A"键}
}
2.3键盘字符事件:
若要模拟键盘字符事件,例如输入文本,您可以使用keyPress和keyRelease方法结合使用,但不需要传递常量。相反,您需要传递字符的ASCII值。例如,模拟键盘输入字符"A":
import java.awt.*;
import java.awt.event.KeyEvent;public class KeyTypedExample {public static void main(String[] args) throws AWTException {Robot robot = new Robot();robot.keyPress(KeyEvent.VK_SHIFT); // 按下Shift键robot.keyPress(KeyEvent.VK_A); // 按下"A"键robot.keyRelease(KeyEvent.VK_A); // 释放"A"键robot.keyRelease(KeyEvent.VK_SHIFT); // 释放Shift键}
}
这些是一些基本的键盘事件示例,您可以根据需要组合它们以模拟更复杂的键盘操作。请注意,模拟键盘事件可能需要处理AWT异常(java.awt.AWTException)并确保具有足够的权限来执行这些操作。
三、鼠标事件
Java的Robot类也可以用于模拟鼠标事件,包括鼠标移动、鼠标按键按下和释放等。以下是一些常见的鼠标事件以及如何使用Robot类模拟它们:
3.1鼠标移动:
要模拟鼠标移动,您可以使用mouseMove方法,传递要移动到的屏幕坐标。例如,将鼠标移动到屏幕坐标(100, 100):
import java.awt.*;public class MouseMoveExample {public static void main(String[] args) throws AWTException {Robot robot = new Robot();robot.mouseMove(100, 100); // 移动鼠标到坐标(100, 100)}
}
3.2鼠标按键按下和释放:
要模拟鼠标按键的按下和释放事件,您可以使用mousePress和mouseRelease方法,分别传递表示鼠标按键的常量。例如,模拟按下和释放左键:
import java.awt.*;
import java.awt.event.InputEvent;public class MouseClickExample {public static void main(String[] args) throws AWTException {Robot robot = new Robot();robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); // 按下左键robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); // 释放左键}
}
3.3鼠标滚轮滚动:
若要模拟鼠标滚轮滚动,可以使用mouseWheel方法,并传递表示滚动量的整数值。正值表示向前滚动,负值表示向后滚动。例如,模拟向前滚动鼠标滚轮三次:
import java.awt.*;public class MouseWheelExample {public static void main(String[] args) throws AWTException {Robot robot = new Robot();robot.mouseWheel(3); // 向前滚动鼠标滚轮三次}
}
这些是一些基本的鼠标事件示例,您可以根据需要组合它们以模拟更复杂的鼠标操作。请注意,模拟鼠标事件也可能需要处理AWT异常(java.awt.AWTException)并确保具有足够的权限来执行这些操作。
3.4示例代码
import java.awt.*;
import java.awt.event.InputEvent;public class MouseEventsDemo {public static void main(String[] args) {try {Robot robot = new Robot();robot.setAutoDelay(500); // 设置事件之间的延迟(毫秒)// 移动鼠标到坐标(300, 300)robot.mouseMove(300, 300);// 模拟点击左键robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);// 等待一段时间robot.delay(1000);// 模拟点击右键robot.mousePress(InputEvent.BUTTON3_DOWN_MASK);robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);// 等待一段时间robot.delay(1000);// 模拟向前滚动鼠标滚轮3次robot.mouseWheel(3);// 等待一段时间robot.delay(1000);// 模拟向后滚动鼠标滚轮2次robot.mouseWheel(-2);} catch (AWTException e) {e.printStackTrace();}}
}
四、应用
4.1屏幕截图
package org.example;import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;public class RobotExample {public static void main(String[] args) throws AWTException, IOException {Robot robot = new Robot();// 设置延迟(毫秒值)robot.delay(1000);// 模拟鼠标按下和释放操作int mouseButton = InputEvent.BUTTON1_DOWN_MASK; // 鼠标左键robot.mousePress(mouseButton);robot.mouseRelease(mouseButton);// 移动鼠标到指定位置(x, y)int x = 100;int y = 100;robot.mouseMove(x, y);// 模拟鼠标滚动(向下滚动)int wheelAmt = 3; // 向下滚动3格robot.mouseWheel(wheelAmt);// 模拟键盘按下和释放操作int keycode = KeyEvent.VK_WINDOWS; // Windows键robot.keyPress(keycode);robot.keyRelease(keycode);// 获取指定坐标处的像素颜色int pixelColorX = 200;int pixelColorY = 200;Color color = robot.getPixelColor(pixelColorX, pixelColorY);// 获取指定矩形区域的屏幕截图int captureX = 100;int captureY = 100;int captureWidth = 500;int captureHeight = 500;BufferedImage screenshot = robot.createScreenCapture(new Rectangle(captureX, captureY, captureWidth, captureHeight));// 保存截图为JPEG文件File outputFile = new File("D:\\桌面\\save.jpg");OutputStream os = new FileOutputStream(outputFile);ImageIO.write(screenshot, "jpg", os);}
}
4.2消息轰炸器
package auto_control;import java.awt.*;
import java.awt.event.KeyEvent;/*** @Author Javee* @Date 2019/8/11 19:54* @Description 一个简单的QQ/微信轰炸器* 用法:把需要发送的信息先复制到电脑的粘贴板(Ctrl + C),* 再运行此代码,然后打开需要轰炸的对象聊天窗口,点击一下* 输入区即可自动轰炸* */
public class Boom {public static void main(String[] args) throws AWTException {Robot robot = new Robot();// 创建Robot对象int times = 50; //轰炸的次数,可以自己修改int time = 500; //两次轰炸之间相隔的时间,单位为毫秒robot.delay(3000);// 延迟三秒,主要是为了预留出打开窗口的时间,括号内的单位为毫秒for (int j = 0; j < times; j++) {//循环次数// 以下两行按下了ctrl+v,完成粘贴功能robot.keyPress(KeyEvent.VK_CONTROL);robot.keyPress(KeyEvent.VK_V);robot.keyRelease(KeyEvent.VK_CONTROL);// 释放ctrl按键,像ctrl,退格键,删除键这样的功能性按键,在按下后一定要释放,不然会出问题。crtl如果按住没有释放,在按其他字母按键是,敲出来的回事ctrl的快捷键。robot.delay(time);// 延迟发送,不然会一次性全发布出去,因为电脑的处理速度很快,每次粘贴发送的速度几乎是一瞬间,所以给人的感觉就是一次性发送了全部。这个时间可以自己改,想几秒发送一条都可以robot.keyPress(KeyEvent.VK_ENTER);// 回车robot.keyRelease(KeyEvent.VK_ENTER);}}
}
4.3自动化数据输入
import java.awt.*;
import java.awt.event.KeyEvent;public class AutoDataInput {public static void main(String[] args) {try {// 创建Robot对象Robot robot = new Robot();// 打开记事本应用程序(可根据您的需求更改应用程序路径)Runtime.getRuntime().exec("notepad.exe");Thread.sleep(2000); // 等待应用程序打开// 输入文本String textToType = "这是自动化数据输入的示例。";for (char c : textToType.toCharArray()) {int keyCode = KeyEvent.getExtendedKeyCodeForChar(c);if (KeyEvent.CHAR_UNDEFINED != keyCode) {robot.keyPress(keyCode);robot.keyRelease(keyCode);}}// 保存文档(Ctrl + S)robot.keyPress(KeyEvent.VK_CONTROL);robot.keyPress(KeyEvent.VK_S);robot.keyRelease(KeyEvent.VK_S);robot.keyRelease(KeyEvent.VK_CONTROL);// 关闭记事本(Alt + F4)robot.keyPress(KeyEvent.VK_ALT);robot.keyPress(KeyEvent.VK_F4);robot.keyRelease(KeyEvent.VK_F4);robot.keyRelease(KeyEvent.VK_ALT);} catch (AWTException | InterruptedException | java.io.IOException e) {e.printStackTrace();}}
}
相关文章:
Java入坑之Robot类
一、概述 1.1Robot类概述 在Java中,Robot是一个属于java.awt包的类。它还扩展了 Object 类。该类用于为测试自动化、自运行演示以及需要控制鼠标和键盘的其他应用程序生成本机系统输入事件。换句话说,我们使用 Java Robot 类来触发输入事件,…...
spring-secrity的Filter顺序+自定义过滤器
Filter顺序 Spring Security的官方文档向我们提供了filter的顺序,实际应用中无论用到了哪些,整体的顺序是保持不变的: ChannelProcessingFilter,重定向到其他协议的过滤器。也就是说如果你访问的channel错了,那首先就会在channel…...
leetcode 371. 两整数之和
异或:不同为1,相同为0,刚好符合加法,但是缺少进位的可能 按位与:只有都为1才为1,否则都为0,如果两个数按位与再左移一位,就能代表所有要进位的位 class Solution {public int getS…...
Medium: Where to Define Qualified users in A/B testing?
1. Common AB Testing Setup Issue (Framework) 局限性: unqualified users will also be considered and mess up experimentation results....
POJ 3662 Telephone Lines 二分,最小化第k大的数
一、题目大意 我们有n个点,p条边,最小化从1到n之间的路径的第k1大的数(当路径不超过k时就是0) 二、解题思路 我们首先用dijkstra过一遍,判断从1能不能到n,不能直接输出-1结束。 1能到达n的话࿰…...
【mybatis-plus进阶】多租户场景中多数据源自定义来源dynamic-datasource实现
Springbootmybatis-plusdynamic-datasourceDruid 多租户场景中多数据源自定义来源dynamic-datasource实现 文章目录 Springbootmybatis-plusdynamic-datasourceDruid 多租户场景中多数据源自定义来源dynamic-datasource实现0.前言1. 作者提供了接口2. 基于此接口的抽象类实现自…...
vue3 async await
const getStruct async () > {//首先从store读取,否则通过接口获取if (store.state.struct.v ! null) {return store.state.struct.v;} else {const data await getStructApi();store.dispatch("struct/keepV", data).then(() > {console.log(&qu…...
CLion远程Linux开发环境搭建及找不到Linux头文件的解决方法
CLion远程开发环境搭建及找不到Linux头文件的解决方法 文章目录 CLion远程开发环境搭建及找不到Linux头文件的解决方法1.前言2.远程开发3.远程编译4.远程调试5.远程开发Linux头文件找不到(比如pthread.h、<sys/socket.h>)6.最后 1.前言 在某些时候…...
Python综合案例(基本地图使用)
一、基本地图的使用 基本代码: """ 演示地图可视化的基本使用 """ from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 准备地图对象 map Map() # 准备数据 data [("北京", 99),("…...
maven的scope总结
scope类型 compiletestprovidedruntimesystemimport compile 编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven 依赖,对于编译、测试、运行三种classpath 都有效。大部分是这种,在编译、测试和运行的时候都需要使…...
Linux执行命令
命令格式 主命令 选项 参数(操作对象)例如: 修改主机名 hostname set-hostname 新名称显示/目录下的文件的详细信息 ls -l /命令 内置命令(builtin):shell程序自带的命令。 外部命令:有独立…...
Nginx 配置中root和alias的区别分析
root和alias都可以定义在location模块中,都是用来指定请求资源的真实路径,比如: location /i/ { root /data/w3; } 请求 http://foofish.net/i/top.gif 这个地址时,那么在服务器里面对应的真正的资源 是 /data/w3/i/top.gif文…...
AP51656 PWM和线性调光 LED车灯电源驱动IC 兼容替代PT4115 PT4205
产品描述 AP51656是一款连续电感电流导通模式的降压恒流源 用于驱动一颗或多颗串联LED 输入电压范围从 5V 到 60V,输出电流 可达 1.5A 。根据不同的输入电压和 外部器件, 可以驱动高达数十瓦的 LED。 内置功率开关,采用高端电流采样设置 …...
视频汇聚/视频云存储/视频监控管理平台EasyCVR部署后无法正常启用是什么问题?该如何解决?
安防监控/视频监控/视频汇聚平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,视频云存储/安防监控汇聚平台EasyCVR支持多种播放协议,包括:HLS、HTTP-FLV、WebSoc…...
Kubernetes v1.25.0集群搭建实战案例(新版本含Docker容器运行时)
k8s 1.24之后弃用了docker容器运行时,安装方式上有所不同,网上找到的大多数都是1.24之前的版本。所以把自己搭建的完整过程记录下来供大家参考。 一、前言 k8s的部署方式有多种kubeadm、kind、minikube、Kubespray、kops等本文介绍官方推荐的kubeadm的…...
RabbitMQ、Kafka和RocketMQ比较
一、概述 消息队列中间件(MQ)是不同系统之间消息传递,异步通信的常见组件,RabbitMQ、Kafka和RocketMQ是目前业界常见的3种消息中间件,本文重点阐述了他们特性差异、架构设计和处理常见问题的方案。 二、特性比较 Ra…...
http和https区别,第三方证书如何保证服务器可信
HTTP(Hypertext Transfer Protocol)和HTTPS(HTTP Secure)是用于在客户端和服务器之间传输数据的协议,它们在以下几个方面有所区别: 安全性:HTTP是明文协议,数据在传输过程中不加密&…...
【内网穿透】使用Nodejs搭建简单的HTTP服务器 ,并实现公网远程访问
目录 前言 1.安装Node.js环境 2.创建node.js服务 3. 访问node.js 服务 4.内网穿透 4.1 安装配置cpolar内网穿透 4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation…...
Linux中的多线程剖析
目录 1、前言 2、多线程理解 2.1 线程 2.2 通俗了解进程和线程 2.2.1 进程是资源分配的基本单位 2.2.2 Linux中的线程是一种轻量化进程 2.3 进程和线程详解 2.3.1 创建一个线程 (pthread_create) 2.3.2 线程自己的一部分数据 2.3.3 线程组 2.3.4 关于进程的其他操作…...
uniapp 集成蓝牙打印功能(个人测试佳博打印机)
uniapp 集成蓝牙打印功能(个人测试京博打印机) uniapp 集成蓝牙打印功能集成佳博内置的接口 uniapp 集成蓝牙打印功能 大家好今天分析的是uniapp 集成蓝牙打印功能,个人开发是app,应该是支持H5(没试过) 集成佳博内置的接口 下载dome地址&…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
