MouseInfo

本文介绍Java AWT包中的MouseInfo类,该类提供了获取鼠标信息的方法,包括鼠标指针位置和鼠标按钮数量。文章详细解释了getPointerInfo()和getNumberOfButtons()两个方法的使用方式及注意事项。
java.awt
类 MouseInfo

java.lang.Object
继承者 java.awt.MouseInfo

public class MouseInfo
extends Object

MouseInfo 提供获取有关鼠标信息的方法,如鼠标指针位置和鼠标按钮数。

从以下版本开始:
1.5

方法摘要
static int getNumberOfButtons()
返回鼠标上的按钮数。
static PointerInfo getPointerInfo()
返回表示鼠标指针当前位置的 PointerInfo 实例。

从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait


方法详细信息
getPointerInfo

public static PointerInfo getPointerInfo()
throws HeadlessException

返回表示鼠标指针当前位置的 PointerInfo 实例。存储在此 PointerInfo 中的 GraphicsDevice 包含该鼠标指针。用于鼠标位置的坐标系统取决于 GraphicsDevice 是否为虚拟屏幕设备的一部分。对于虚拟屏幕设备,坐标在虚拟坐标系统中给出,否则,它们将在 GraphicsDevice 的坐标系统中返回。有关虚拟屏幕设备的更多信息,请参阅 GraphicsConfiguration。在没有鼠标的系统上,返回 null。

如果存在安全管理器,则在创建和返回 PointerInfo 对象之前,将使用 AWTPermission("watchMousePointer") 权限调用其 checkPermission 方法。这可能导致一个 SecurityException 异常。

返回:
鼠标指针的位置
抛出:
HeadlessException - 如果 GraphicsEnvironment.isHeadless() 返回 true
SecurityException - 如果存在安全管理器,而且其 checkPermission 方法不允许此操作
从以下版本开始:
1.5
另请参见:
GraphicsConfiguration, SecurityManager.checkPermission(java.security.Permission), AWTPermission

getNumberOfButtons

public static int getNumberOfButtons()
throws HeadlessException

返回鼠标上的按钮数。在没有鼠标的系统上,返回 -1。

返回:
鼠标上的按钮数
抛出:
HeadlessException - 如果 GraphicsEnvironment.isHeadless() 返回 true
从以下版本开始:
1.5
import java.awt.AWTException; import java.awt.MouseInfo; import java.awt.Point; import java.awt.Robot; public class MouseIdleShake { public static void main(String[] args) { try { // 创建一个 Robot 对象,用于模拟鼠标操作 Robot robot = new Robot(); // 获取当前鼠标的位置 Point lastPosition = MouseInfo.getPointerInfo().getLocation(); // 记录当前时间,用于后续判断鼠标是否在 1 分钟内未移动 long lastTime = System.currentTimeMillis(); // 进入一个无限循环,持续监测鼠标位置和时间 while (true) { // 获取当前鼠标的位置 Point currentPosition = MouseInfo.getPointerInfo().getLocation(); // 获取当前时间 long currentTime = System.currentTimeMillis(); // 判断鼠标位置是否未改变,并且时间间隔是否超过 1 分钟(60000 毫秒) if (currentPosition.equals(lastPosition) && (currentTime - lastTime) >= 60000) { // 如果满足条件,调用 shakeMouse 方法抖动鼠标 shakeMouse(robot); // 更新最后记录的时间为当前时间 lastTime = currentTime; } // 如果鼠标位置发生了改变 if (!currentPosition.equals(lastPosition)) { // 更新最后记录的鼠标位置为当前位置 lastPosition = currentPosition; // 更新最后记录的时间为当前时间 lastTime = currentTime; } // 线程休眠 100 毫秒,避免过于频繁地检查鼠标位置,降低 CPU 占用 Thread.sleep(100); } } catch (AWTException | InterruptedException e) { // 捕获可能出现的异常并打印异常信息 e.printStackTrace(); } } private static void shakeMouse(Robot robot) { // 获取当前鼠标的位置 Point mousePosition = MouseInfo.getPointerInfo().getLocation(); // 获取当前鼠标位置的 X 坐标 int originalX = (int) mousePosition.getX(); // 获取当前鼠标位置的 Y 坐标 int originalY = (int) mousePosition.getY(); // 模拟鼠标抖动 // 将鼠标向右移动 10 个像素 robot.mouseMove(originalX + 10, originalY); // 线程休眠 100 毫秒,控制抖动的频率 robot.delay(100); // 将鼠标向左移动 20 个像素(回到原位置左边 10 个像素) robot.mouseMove(originalX - 10, originalY); // 线程休眠 100 毫秒,控制抖动的频率 robot.delay(100); // 将鼠标移动回原来的位置 robot.mouseMove(originalX, originalY); } } 为什么我把这个服务启动之后,切换到别的页面。鼠标就不抖动了
09-20
import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import javax.swing.*; public class SmartMouseShaker { private static volatile Point lastPosition; private static long lastMoveTime; private static final int CHECK_INTERVAL = 500; // 检测间隔500ms(平衡性能与响应) private static final int SHAKE_CYCLES = 2; // 抖动周期数(增强效果) public static void main(String[] args) { // 1. 验证图形环境兼容性 if (GraphicsEnvironment.isHeadless()) { System.err.println("Error: Headless environment not supported. Exiting..."); return; } // 2. 初始化机器人控制 final Robot robot; try { robot = new Robot(); } catch (AWTException e) { System.err.println("Failed to initialize Robot: " + e.getMessage()); return; } // 3. 创建隐式窗口实现事件监听(避免轮询CPU占用) JFrame hiddenFrame = new JFrame(); hiddenFrame.setUndecorated(true); hiddenFrame.setSize(1, 1); // 最小化窗口尺寸 hiddenFrame.setLocation(-100, -100); // 移出可视区域 hiddenFrame.setVisible(true); // 4. 鼠标移动事件监听(替代轮询) hiddenFrame.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent e) { lastPosition = e.getPoint(); lastMoveTime = System.currentTimeMillis(); } }); // 5. 定时检测线程 new Thread(() -> { lastPosition = MouseInfo.getPointerInfo().getLocation(); lastMoveTime = System.currentTimeMillis(); while (true) { try { Thread.sleep(CHECK_INTERVAL); long currentTime = System.currentTimeMillis(); // 检测静止超时(1分钟=60,000ms) if (currentTime - lastMoveTime >= 60000) { shakeMouse(robot); lastMoveTime = currentTime; // 重置计时器 } } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } } }).start(); System.out.println("Mouse Shaker is running. Press Ctrl+C to exit."); } private static void shakeMouse(Robot robot) { Point p = MouseInfo.getPointerInfo().getLocation(); int baseX = (int) p.getX(); int baseY = (int) p.getY(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); // 限制抖动范围(避免移出屏幕) int maxOffsetX = Math.min(15, screenSize.width - baseX - 10); int maxOffsetY = Math.min(10, screenSize.height - baseY - 10); int offsetX = Math.max(10, maxOffsetX); // 确保最小幅度 int offsetY = Math.max(8, maxOffsetY); // 多方向抖动(增强自然感) for (int i = 0; i < SHAKE_CYCLES; i++) { robot.mouseMove(baseX + offsetX, baseY + offsetY); robot.delay(40); robot.mouseMove(baseX - offsetX, baseY - offsetY); robot.delay(40); } robot.mouseMove(baseX, baseY); // 精准回归原位 } }
最新发布
09-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值