用到的包
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 ( ) ) ;