package me.test;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HMODULE;
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.HOOKPROC;
import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT;
import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc;
// 全局键盘钩子
public class Test04 {
public static HHOOK hHook;
public static HOOKPROC lpfn;
public static volatile boolean quit = false;
public static void main(String[] args) {
HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
lpfn = new LowLevelKeyboardProc() {
int count = 1;
public LRESULT callback(int nCode, WPARAM wParam,
KBDLLHOOKSTRUCT keyInfo) {
System.out.println("nCode =" + nCode + ", wParam =" + wParam
+ ", vkCode=" + keyInfo.vkCode);
count++;
if (count > 100) {
quit = true;
}
return User32.INSTANCE.CallNextHookEx(hHook, nCode, wParam,
keyInfo.getPointer());
}
};
// 如果是全局钩子,则线程ID为0
int threadId = 0;
// int threadId =
// user32.GetWindowThreadProcessId(user32.FindWindow(null, "无标题 - 记事本"),
// null);
System.out.println("threadId = "
+ Integer.toHexString(threadId).toUpperCase());
int idHook = User32.WH_KEYBOARD_LL;
hHook = User32.INSTANCE.SetWindowsHookEx(idHook, lpfn, hMod, threadId);
if (hHook == null) {
System.out.println("键盘钩子安装失败,error = "
+ Kernel32.INSTANCE.GetLastError());
return;
}
User32.MSG msg = new User32.MSG();
while (!quit) {
User32.INSTANCE.PeekMessage(msg, null, 0, 0, 0);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (User32.INSTANCE.UnhookWindowsHookEx(hHook)) {
System.out.println("Unhooked");
}
}
}