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

发布于:2025-07-16 ⋅ 阅读:(15) ⋅ 点赞:(0)

监听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() {
            @Override
            public void run() {
                System.out.println(234);
            }
        });

        // 关闭时卸载钩子
        primaryStage.setOnCloseRequest(e -> GlobalMouseHook.stopHook());

网站公告

今日签到

点亮在社区的每一天
去签到