java键盘钩子_java 写的低级鼠标键盘钩子示例

这篇博客介绍了如何使用Java的JNA库来创建低级键盘和鼠标钩子,以便捕获和处理键盘和鼠标的输入事件。示例代码展示了如何安装和卸载钩子,以及如何处理各种键盘和鼠标事件。
摘要由CSDN通过智能技术生成

需要到

http://java.net/projects/jna/downloads下载 jna.jar 和 platform.jar

(参考http://my.oschina.net/penngo/blog/12356):

1.[代码][Java]代码

package jna_test;

import com.sun.jna.platform.win32.*;

import com.sun.jna.platform.win32.WinUser.*;

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.KBDLLHOOKSTRUCT;

import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc;

import com.sun.jna.win32.WinUser.Mouse.LowLevelMouseProc;

import com.sun.jna.win32.WinUser.Mouse.MOUSEHOOKSTRUCT;

public class MouseLLHook {

// 鼠标钩子函数里判断按键类型的常数

public static final int WM_LBUTTONUP = 514;

public static final int WM_LBUTTONDOWN = 513;

public static final int WM_RBUTTONUP = 517;

public static final int WM_RBUTTONDOWN = 516;

public static final int WM_MOUSEHWHEEL = 526;

public static final int WM_MOUSEWHEEL = 522;

public static final int WM_MOUSEMOVE = 512;

static HHOOK mouseHHK,keyboardHHK;//鼠标、键盘钩子的句柄

static LowLevelMouseProc mouseHook;//鼠标钩子函数

static LowLevelKeyboardProc keyboardHook;//键盘钩子函数

// 安装钩子

static void setHook() {

HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);

mouseHHK = User32.INSTANCE.SetWindowsHookEx(WinUser.WH_MOUSE_LL, mouseHook, hMod, 0);

keyboardHHK = User32.INSTANCE.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL, keyboardHook, hMod, 0);

}

//卸载钩子

static void unhook() {

User32.INSTANCE.UnhookWindowsHookEx(keyboardHHK);

User32.INSTANCE.UnhookWindowsHookEx(mouseHHK);

}

public static void main(String[] args) {

keyboardHook = new LowLevelKeyboardProc() {

@Override

//该函数参数的意思参考:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644985(v=vs.85).aspx

public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT lParam) {

int w = wParam.intValue();

//按下alt键时w=.WM_SYSKEYDOWN; 按下其他大部分键时w=WinUser.WM_KEYDOWN

if(w==WinUser.WM_KEYDOWN || w==WinUser.WM_SYSKEYDOWN)

System.out.println("key down: vkCode = "+lParam.vkCode);

else if(w==WinUser.WM_KEYUP || w==WinUser.WM_SYSKEYUP)

System.out.println("key up: vkCode = "+lParam.vkCode);

// 如果按下'q'退出程序,'q'的vkCode是81

if(lParam.vkCode==81) {

unhook();

System.err.println("program terminated.");

System.exit(0);

}

return User32.INSTANCE.CallNextHookEx(keyboardHHK, nCode, wParam, lParam.getPointer());

}

};

mouseHook = new LowLevelMouseProc() {

@Override

//该函数参数的意思参考:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644986(v=vs.85).aspx

public LRESULT callback(int nCode, WPARAM wParam, MOUSEHOOKSTRUCT lParam) {

switch (wParam.intValue()) {

case WM_MOUSEMOVE:

System.out.print("mouse moved:");

break;

case WM_LBUTTONDOWN:

System.out.print("mouse left button down:");

break;

case WM_LBUTTONUP:

System.out.print("mouse left button up");

break;

case WM_RBUTTONUP:

System.out.print("mouse right button up:");

break;

case WM_RBUTTONDOWN:

System.out.print("mouse right button down:");

break;

case WM_MOUSEWHEEL:

System.out.print("mouse wheel rotated:");

break;

}

System.out.println("("+lParam.pt.x+","+lParam.pt.y+")");

return User32.INSTANCE.CallNextHookEx(mouseHHK, nCode, wParam, lParam.getPointer());

}

};

System.out.println("press 'q' to quit.");

setHook();

int result;

MSG msg = new MSG();

// 消息循环

// 实际上while循环一次都不执行,这些代码的作用我理解是让程序在GetMessage函数这里阻塞,不然程序就结束了。

while ((result = User32.INSTANCE.GetMessage(msg, null, 0, 0)) != 0) {

if (result == -1) {

System.err.println("error in GetMessage");

unhook();

break;

} else {

User32.INSTANCE.TranslateMessage(msg);

User32.INSTANCE.DispatchMessage(msg);

}

}

unhook();

}

}

2.[代码]以上代码如果有两个类找不到(不知什么原因,我当时下载的版本就可以),那就只好自己写了:

import com.sun.jna.Structure;

import com.sun.jna.platform.win32.BaseTSD.ULONG_PTR;

import com.sun.jna.platform.win32.WinDef.HWND;

import com.sun.jna.platform.win32.WinDef.LRESULT;

import com.sun.jna.platform.win32.WinDef.WPARAM;

import com.sun.jna.platform.win32.WinUser.HOOKPROC;

import com.sun.jna.platform.win32.WinUser.POINT;

interface LowLevelMouseProc extends HOOKPROC {

LRESULT callback(int nCode, WPARAM wParam, MOUSEHOOKSTRUCT lParam);

}

class MOUSEHOOKSTRUCT extends Structure {

public class ByReference extends MOUSEHOOKSTRUCT implements

Structure.ByReference {

};

public POINT pt;

public HWND hwnd;

public int wHitTestCode;

public ULONG_PTR dwExtraInfo;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值