用到的包
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 = new Robot();robot.setAutoDelay(100); robot.keyPress(KeyEvent.VK_ALT);robot.keyPress(KeyEvent.VK_F4);robot.keyRelease(KeyEvent.VK_F4);robot.keyRelease(KeyEvent.VK_ALT);System.out.println("已模拟 Alt+F4 快捷键");} catch (AWTException e) {e.printStackTrace();}}public static void executeALTESC(){try {Robot robot = new Robot();robot.setAutoDelay(100); robot.keyPress(KeyEvent.VK_ALT);robot.keyPress(KeyEvent.VK_ESCAPE);robot.keyRelease(KeyEvent.VK_ESCAPE);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());