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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 可用的公开 RTSP/ RTMP 在线视频流资源地址[通俗易懂]

    更新时间:2020年11月09日最近在做海康视频的流媒体转码,特收集几个可以访问的在线流媒体资源测试使用:RTSP:rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.movRTMP:湖南卫视:rtmp://58.200.131.2:1935/livetv/hunantv广东卫视:rtmp://58.200.131.2:1935/livetv/gdtv东方卫视:rtmp://58.200.131.2:1935/livet

    2022年4月6日
    178
  • 使用docker启动mysql8.0挂载配置文件_docker的特点

    使用docker启动mysql8.0挂载配置文件_docker的特点使用docker启动MySQL8.0因为mysql8对登录密码的加密方式做了调整,所以每次安装完mysql都要去翻翻教程,特此记录下,方便以后查看docker启动脚本#!/bin/bashdockerrm-fmysql8dockerrun–namemysql8\-eMYSQL_ROOT_PASSWORD=123456\-v/usr/local/mysql/logs:/logs\-v/usr/local/mysql/data:/var/lib/mys

    2022年10月5日
    1
  • 周易经典语录 名句集锦_感悟人生的句子 励志

    周易经典语录 名句集锦_感悟人生的句子 励志《周易》亦称《易经》,简称《易》,此书是我国最早的哲学著作,为“六经之首”,其中也有大量反映古代生活的歌谣。古代有《连山》、《归藏》、《周易》三种不同系统的易学。《连山》据说是夏代的易学,《归藏》是殷代的易学,《周易》是周代的易学。前二书皆佚,今只存《周易》。1.居上位而不骄,在下位而不忧。出自《易经·乾传》。释义:在上位不骄傲自大,在下位就无须担忧了。2.人之所助者,信也。出自《易经…

    2022年8月18日
    12
  • Tabnine Pro 激活码(破解版激活)「建议收藏」

    Tabnine Pro 激活码(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    451
  • 无人机视觉定位是怎么回事_drone无人机怎么下APP

    无人机视觉定位是怎么回事_drone无人机怎么下APPhttp://www.aiskyeye.com/2018年已经办过一年了。2019年在ICCV上办。Weencouragetheparticipantstousetheprovidedtrainingdataforeachtask,butalsoallowthemtouseadditionaltrainingdata.Theuseofadd…

    2022年8月15日
    4
  • oracle如何格式化日期,Oracle 日期格式化处理汇总[通俗易懂]

    oracle如何格式化日期,Oracle 日期格式化处理汇总[通俗易懂]一、日期及时间格式化应用TO_CHAR(日期,格式化参数)1、返回任意有效分割符拼接的年月日字符串1.1、Selectto_char(sysdate,’yyyy/mm/dd’)Fromdual;*************************2015/04/29(即返回以’/’分隔符连接的字符串,也可以替换为’^’连接则结果为2015^04^29,也可以替换为’-‘则结果为2015-0…

    2022年6月1日
    1.3K

发表回复

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

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