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

java键盘钩子_java 写的低级鼠标键盘钩子示例需要到http://java.net/projects/jna/downloads下载jna.jar和platform.jar(参考http://my.oschina.net/penngo/blog/12356):1.[代码][Java]代码packagejna_test;importcom.sun.jna.platform.win32.*;importcom.sun.jna.plat…

大家好,又见面了,我是你们的朋友全栈君。

需要到

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;

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137925.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android ViewPager使用详解

    Android ViewPager使用详解这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api。而viewpager就是其中之一利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等。那如何使用它呢,与LisstView类似,我们也需要一个适配器,他就是PagerAdapter。看一下api的图片, ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样。分三个步

    2022年5月23日
    33
  • IDEA使用mave-tomcat7插件启动报ClassFormatException

    IDEA使用mave-tomcat7插件启动报ClassFormatException

    2021年7月11日
    165
  • 快速幂的大数运算_快速幂模

    快速幂的大数运算_快速幂模快速幂运算1.什么是快速幂2.快速幂的“小数”运算3.高精度(大数)的快速幂1.什么是快速幂快速幂,是指在进行幂运算的时候,用一种快速方法得出答案。比如,要求2^100的值,那按照最简单的方式,就是一个一个2去相乘,然后最终得到答案,那么这样就要计算100次,非常浪费时间,那么快速幂就是使用一种技巧使得将其计算次数减少,快速得到答案。2.快速幂的“小数”运算对于系统内置类型的整型,暂且叫他“小数”,这个时候进行快速幂运算,代码如下:#include<cstdio>#include&l

    2025年7月14日
    4
  • c中的变量

    c中的变量

    2022年3月6日
    41
  • Java判断关系运算

    Java判断关系运算

    2021年9月1日
    63
  • matlab图像处理基础「建议收藏」

    matlab图像处理基础「建议收藏」1、MATLAB中图象数据的读取A、imread   imread函数用于读入各种图象文件,其一般的用法为          [X,MAP]=imread(‘filename’,‘fmt’)其中,X,MAP分别为读出的图象数据和颜色表数据,fmt为图象的格式,filename为读取的图象文件(可以加上文件的路径)。例:[X,MAP]=imread(’flowers.t

    2022年10月4日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号