当前位置: 首页 > news >正文

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中&#xff0c;Robot是一个属于java.awt包的类。它还扩展了 Object 类。该类用于为测试自动化、自运行演示以及需要控制鼠标和键盘的其他应用程序生成本机系统输入事件。换句话说&#xff0c;我们使用 Java Robot 类来触发输入事件&#xff0c;…...

spring-secrity的Filter顺序+自定义过滤器

Filter顺序 Spring Security的官方文档向我们提供了filter的顺序&#xff0c;实际应用中无论用到了哪些&#xff0c;整体的顺序是保持不变的: ChannelProcessingFilter&#xff0c;重定向到其他协议的过滤器。也就是说如果你访问的channel错了&#xff0c;那首先就会在channel…...

leetcode 371. 两整数之和

异或&#xff1a;不同为1&#xff0c;相同为0&#xff0c;刚好符合加法&#xff0c;但是缺少进位的可能 按位与&#xff1a;只有都为1才为1&#xff0c;否则都为0&#xff0c;如果两个数按位与再左移一位&#xff0c;就能代表所有要进位的位 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个点&#xff0c;p条边&#xff0c;最小化从1到n之间的路径的第k1大的数&#xff08;当路径不超过k时就是0&#xff09; 二、解题思路 我们首先用dijkstra过一遍&#xff0c;判断从1能不能到n&#xff0c;不能直接输出-1结束。 1能到达n的话&#xff0…...

【mybatis-plus进阶】多租户场景中多数据源自定义来源dynamic-datasource实现

Springbootmybatis-plusdynamic-datasourceDruid 多租户场景中多数据源自定义来源dynamic-datasource实现 文章目录 Springbootmybatis-plusdynamic-datasourceDruid 多租户场景中多数据源自定义来源dynamic-datasource实现0.前言1. 作者提供了接口2. 基于此接口的抽象类实现自…...

vue3 async await

const getStruct async () > {//首先从store读取&#xff0c;否则通过接口获取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头文件找不到&#xff08;比如pthread.h、<sys/socket.h>&#xff09;6.最后 1.前言 在某些时候…...

Python综合案例(基本地图使用)

一、基本地图的使用 基本代码&#xff1a; """ 演示地图可视化的基本使用 """ from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 准备地图对象 map Map() # 准备数据 data [("北京", 99),("…...

maven的scope总结

scope类型 compiletestprovidedruntimesystemimport compile 编译依赖范围。如果没有指定&#xff0c;就会默认使用该依赖范围。使用此依赖范围的Maven 依赖&#xff0c;对于编译、测试、运行三种classpath 都有效。大部分是这种&#xff0c;在编译、测试和运行的时候都需要使…...

Linux执行命令

命令格式 主命令 选项 参数&#xff08;操作对象&#xff09;例如&#xff1a; 修改主机名 hostname set-hostname 新名称显示/目录下的文件的详细信息 ls -l /命令 内置命令&#xff08;builtin&#xff09;&#xff1a;shell程序自带的命令。 外部命令&#xff1a;有独立…...

Nginx 配置中root和alias的区别分析

root和alias都可以定义在location模块中&#xff0c;都是用来指定请求资源的真实路径&#xff0c;比如&#xff1a; location /i/ { root /data/w3; } 请求 http://foofish.net/i/top.gif 这个地址时&#xff0c;那么在服务器里面对应的真正的资源 是 /data/w3/i/top.gif文…...

AP51656 PWM和线性调光 LED车灯电源驱动IC 兼容替代PT4115 PT4205

产品描述 AP51656是一款连续电感电流导通模式的降压恒流源 用于驱动一颗或多颗串联LED 输入电压范围从 5V 到 60V&#xff0c;输出电流 可达 1.5A 。根据不同的输入电压和 外部器件&#xff0c; 可以驱动高达数十瓦的 LED。 内置功率开关&#xff0c;采用高端电流采样设置 …...

视频汇聚/视频云存储/视频监控管理平台EasyCVR部署后无法正常启用是什么问题?该如何解决?

安防监控/视频监控/视频汇聚平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;视频云存储/安防监控汇聚平台EasyCVR支持多种播放协议&#xff0c;包括&#xff1a;HLS、HTTP-FLV、WebSoc…...

Kubernetes v1.25.0集群搭建实战案例(新版本含Docker容器运行时)

k8s 1.24之后弃用了docker容器运行时&#xff0c;安装方式上有所不同&#xff0c;网上找到的大多数都是1.24之前的版本。所以把自己搭建的完整过程记录下来供大家参考。 一、前言 k8s的部署方式有多种kubeadm、kind、minikube、Kubespray、kops等本文介绍官方推荐的kubeadm的…...

RabbitMQ、Kafka和RocketMQ比较

一、概述 消息队列中间件&#xff08;MQ&#xff09;是不同系统之间消息传递&#xff0c;异步通信的常见组件&#xff0c;RabbitMQ、Kafka和RocketMQ是目前业界常见的3种消息中间件&#xff0c;本文重点阐述了他们特性差异、架构设计和处理常见问题的方案。 二、特性比较 Ra…...

http和https区别,第三方证书如何保证服务器可信

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和HTTPS&#xff08;HTTP Secure&#xff09;是用于在客户端和服务器之间传输数据的协议&#xff0c;它们在以下几个方面有所区别&#xff1a; 安全性&#xff1a;HTTP是明文协议&#xff0c;数据在传输过程中不加密&…...

【内网穿透】使用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 集成蓝牙打印功能&#xff08;个人测试京博打印机&#xff09; uniapp 集成蓝牙打印功能集成佳博内置的接口 uniapp 集成蓝牙打印功能 大家好今天分析的是uniapp 集成蓝牙打印功能&#xff0c;个人开发是app,应该是支持H5(没试过) 集成佳博内置的接口 下载dome地址&…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

JavaScript 标签加载

目录 JavaScript 标签加载script 标签的 async 和 defer 属性&#xff0c;分别代表什么&#xff0c;有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...