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

【JAVA】监听windows中鼠标侧面键的按钮按下事件

监听windows中鼠标侧面键的按钮按下事件

    • 用到的包
    • 核心类
    • 使用这个类

用到的包

jna-5.11.0.jar
jna-platform-5.11.0.jar

核心类

package sample.tt.mouse;import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.*;
import com.sun.jna.platform.win32.WinDef.HMODULE;
import com.sun.jna.platform.win32.WinDef.LPARAM;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinUser.HHOOK;
import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT;
import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc;
import com.sun.jna.platform.win32.WinUser.MSG;import java.awt.*;
import java.awt.event.KeyEvent;public class GlobalMouseHook {private static HHOOK hHook;private static LowLevelMouseProc mouseProc;private static User32 lib;// 手动定义鼠标事件常量private static final int WM_XBUTTONDOWN = 0x020B;private static final int XBUTTON1 = 0x0001;private static final int XBUTTON2 = 0x0002;private static LRESULT callback(int nCode, WPARAM wParam, WinUser.MSLLHOOKSTRUCT lParam) {if (nCode >= 0) {int wParamValue = wParam.intValue();// 检测侧面键按下事件if (wParamValue == WM_XBUTTONDOWN) {int buttonId = (lParam.mouseData >> 16) & 0xFFFF;if (buttonId == XBUTTON1) {//左侧从前往后第一个按钮executeALTF4();}if (buttonId == XBUTTON2) {//左侧从前往后第一个按钮executeALTESC();}}}return lib.CallNextHookEx(hHook, nCode, wParam, new LPARAM(Pointer.nativeValue(lParam.getPointer())));}public interface LowLevelMouseProc extends WinUser.HOOKPROC {LRESULT callback(int nCode, WPARAM wParam, WinUser.MSLLHOOKSTRUCT lParam);}public static void startHook(Runnable onSideButtonClick) {lib = User32.INSTANCE;HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);mouseProc = GlobalMouseHook::callback;hHook = lib.SetWindowsHookEx(WinUser.WH_MOUSE_LL,mouseProc,hMod,0);// 消息循环new Thread(() -> {MSG msg = new MSG();while (lib.GetMessage(msg, null, 0, 0) != 0) {lib.TranslateMessage(msg);lib.DispatchMessage(msg);}}).start();}public static void stopHook() {if (hHook != null) {lib.UnhookWindowsHookEx(hHook);hHook = null;}}public static void executeALTF4(){try {// 创建 Robot 实例Robot robot = new Robot();robot.setAutoDelay(100); // 设置按键间隔,确保系统能正确识别组合键// 模拟按下 Alt 键robot.keyPress(KeyEvent.VK_ALT);// 模拟按下 F4 键robot.keyPress(KeyEvent.VK_F4);// 释放 F4 键robot.keyRelease(KeyEvent.VK_F4);// 释放 Alt 键robot.keyRelease(KeyEvent.VK_ALT);System.out.println("已模拟 Alt+F4 快捷键");} catch (AWTException e) {e.printStackTrace();}}public static void executeALTESC(){try {// 创建 Robot 实例Robot robot = new Robot();robot.setAutoDelay(100); // 设置按键间隔,确保系统能正确识别组合键// 模拟按下 Alt 键robot.keyPress(KeyEvent.VK_ALT);// 模拟按下 F4 键robot.keyPress(KeyEvent.VK_ESCAPE);// 释放 F4 键robot.keyRelease(KeyEvent.VK_ESCAPE);// 释放 Alt 键robot.keyRelease(KeyEvent.VK_ESCAPE);System.out.println("已模拟 Alt+F4 快捷键");} catch (AWTException e) {e.printStackTrace();}}
}

使用这个类

        // 启动全局钩子GlobalMouseHook.startHook(new Runnable() {@Overridepublic void run() {System.out.println(234);}});// 关闭时卸载钩子primaryStage.setOnCloseRequest(e -> GlobalMouseHook.stopHook());
http://www.dtcms.com/a/278418.html

相关文章:

  • Web 前端面试
  • redis实现红锁
  • (1-7-3)数据库的基本查询
  • 【React Native】Switch、Alert、Dimensions、StatusBar、Image组件
  • 打破数据孤岛!医疗数据如何实现“可用不可见”?
  • OpenVela之开发自测试框架cmocka
  • 深入解析ThreadLocal:线程隔离的奥秘与内存泄漏解决方案
  • HarmonyOS从入门到精通:动画设计与实现之九 - 实用动画案例详解(上)
  • Linux操作系统从入门到实战(八)详细讲解编译器gcc/g++编译步骤与动静态库链接
  • C语言:20250714笔记
  • 更改elementui 图标 css content
  • Docker搭建Redis分片集群
  • kotlin学习笔记
  • Kubernetes Ingress:实现HTTPHTTPS流量管理
  • HarmonyOS应用无响应(AppFreeze)深度解析:从检测原理到问题定位
  • Spring Boot 双数据源配置
  • 基于Python的物联网岗位爬取与可视化系统的设计与实现【海量数据、全网岗位可换】
  • java基础(day07)
  • java基础-1 : 运算符
  • 如何连接 AWS RDS 数据库实例
  • Spark 和 Hadoop MapReduce 的基本概念及区别
  • 2D和3D激光slam的点云去运动畸变
  • autoware激光雷达和相机标定
  • 0-1搭建springboot+vue的教务管理系统(核心源码)
  • 第一次接触自动化监测,需要付费厂家安装服务吗?比人工测量主要区别是啥?
  • 使用 pytest 测试框架构建自动化测试套件之一
  • 各种开发语言主要语法对比
  • Linux:1_Linux下基本指令
  • 【数据结构】基于顺序表的通讯录实现
  • c#进阶之数据结构(动态数组篇)----Queue