用到的包
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() {
@Override
public void run() {
System.out.println(234);
}
});
primaryStage.setOnCloseRequest(e -> GlobalMouseHook.stopHook());