package w32keyhook; import com.sun.jna.*; import com.sun.jna.win32.*; import com.sun.jna.examples.win32.*; import com.sun.jna.examples.win32.User32.MSG; import com.sun.jna.examples.win32.User32.LowLevelKeyboardProc; import com.sun.jna.examples.win32.User32.KBDLLHOOKSTRUCT; import com.sun.jna.examples.win32.W32API.LRESULT; import com.sun.jna.examples.win32.W32API.WPARAM; import com.sun.jna.examples.win32.W32API.HMODULE; import com.sun.jna.examples.win32.User32.HHOOK; /** Sample implementation of a low-level keyboard hook on W32. */ public class KeyHook { private static volatile boolean quit; private static HHOOK hhk; private static LowLevelKeyboardProc keyboardHook; public static void main(String[] args) { final User32 lib = User32.INSTANCE; HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null); keyboardHook = new LowLevelKeyboardProc() { public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) { if (nCode >= 0) { switch(wParam.intValue()) { case User32.WM_KEYUP: case User32.WM_KEYDOWN: case User32.WM_SYSKEYUP: case User32.WM_SYSKEYDOWN: System.err.println("in callback, key=" + info.vkCode); if (info.vkCode == 81) { quit = true; } } } return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer()); } }; hhk = lib.SetWindowsHookEx(User32.WH_KEYBOARD_LL, keyboardHook, hMod, 0); System.out.println("Keyboard hook installed, type anywhere, 'q' to quit"); new Thread() { public void run() { while (!quit) { try { Thread.sleep(10); } catch(Exception e) { } } System.err.println("unhook and exit"); lib.UnhookWindowsHookEx(hhk); System.exit(0); } }.start(); // This bit never returns from GetMessage int result; MSG msg = new MSG(); while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) { if (result == -1) { System.err.println("error in get message"); break; } else { System.err.println("got message"); lib.TranslateMessage(msg); lib.DispatchMessage(msg); } } lib.UnhookWindowsHookEx(hhk); } }