`
includemain
  • 浏览: 32826 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类
最新评论

jna test【鼠标 键盘钩子】

    博客分类:
  • Java
 
阅读更多
package jna_test;

import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinUser.HOOKPROC;

interface LowLevelMouseProc extends HOOKPROC {
	LRESULT callback( int nCode, WPARAM wParam, MOUSEHOOKSTRUCT lParam );
}


package jna_test;

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.WinUser.POINT;

public 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;
}

package jna_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;
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.platform.win32.WinUser.MSG;

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 = " + displayCode( lParam.vkCode ) );
				else
					if ( w == WinUser.WM_KEYUP || w == WinUser.WM_SYSKEYUP )
						System.out.println( "key up: vkCode = " + displayCode( 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() );
			}

			private char displayCode( int vkCode ) {
/*				if ( vkCode > 'a' && vkCode < 'z') {
					return "" + ( char ) vkCode;
				}
				if ( vkCode > 'A' && vkCode < 'Z') {
					return "" + ( char ) vkCode;
				}*/
				return (char ) vkCode ;
			}
		};
		
		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();
	}
	
}
分享到:
评论

相关推荐

    jna控制键盘

    标题中的“jna控制键盘”指的是使用Java Native Access (JNA) 库来实现对键盘输入的控制。JNA是Java平台上的一个开源库,它允许Java代码与本机库进行交互,无需编写C/C++的JNI代码。通过JNA,开发者可以直接调用操作...

    java开发模拟鼠标键盘操作

    在Java开发中,模拟鼠标和键盘操作是一项实用的技术,它允许程序员通过代码来模拟用户对计算机的交互行为,比如点击、移动鼠标、按键输入等。这样的功能在自动化测试、远程控制、游戏辅助等方面有着广泛的应用。下面...

    java 控制鼠标*键盘的 jna 库32位

    在这个场景下,"java 控制鼠标*键盘的 jna 库32位" 提供了这样的功能,通过Java Native Access (JNA) 库来实现。 JNA 是一个Java库,允许Java代码与本地平台API直接交互,而无需编写C代码或使用Java本机接口(JNI)。...

    java控制windows鼠标键盘

    总之,"java控制windows鼠标键盘"项目结合了Java的AWT/SWT库以及可能的WinAPI/JNA技术,为开发者提供了一个全面的解决方案,用于在Windows环境下实现鼠标、键盘和触摸设备的控制。通过这个工具箱,开发者可以轻松地...

    JAVA实现键盘钩子的源代码

    仅用JAVA实现全局键盘钩子的功能,很好很强大,学习下

    JNA_Test.rar.rar

    标题中的"JNA_Test.rar.rar"可能是一个包含示例程序或者测试用例的压缩文件,用于演示如何使用JNA进行本地系统调用。由于文件名的重复,这可能是由于压缩错误或有意为之,可能需要解压两次才能得到实际的内容。 ...

    jna_test.rar_JNA JAVA C_jna_jna 函数

    本示例"jna_test.rar"着重展示了如何使用JNA在Java中调用C函数,以及实现C函数回调Java方法。 首先,理解JNA的工作原理至关重要。JNA的核心在于映射(mapping),它将Java类和方法映射到本地库中的函数和结构。JNA...

    Java监听键盘鼠标全局事件[定义].pdf

    Java监听键盘鼠标全局事件 Java监听键盘鼠标全局事件是指使用Java语言来监听和处理键盘和鼠标事件的技术。这项技术广泛应用于游戏开发、自动化测试、屏幕阅读器等领域。下面是Java监听键盘鼠标全局事件的详细知识点...

    jna.rar_jna_jna.jar_jna文件

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码无需编写本地代码(如C/C++)即可直接调用操作系统级别的API。JNA通过动态链接库(DLLs on Windows,shared libraries on Unix/Linux)实现了这...

    jna整合包-jna4.5.0+jna4.0.0.rar

    在你提供的压缩包"jna整合包-jna4.5.0+jna4.0.0.rar"中,包含了两个版本的JNA库:jna-4.0.0.jar和jna-4.5.0.jar。这两个版本的差异主要体现在功能的完善和性能的优化上。JNA 4.5.0是较新的版本,相比4.0.0,它可能...

    testJna.zip

    《Android JNA 开发详解——以testJna.zip为例》 在移动开发领域,Android作为主流的操作系统之一,其丰富的功能和强大的性能吸引了无数开发者。然而,由于Android原生环境是Java,对于需要调用C/C++等本地库的情况...

    jna-4.5.1 , jna-4.5.1-sources , jna-platform-4.5.1 jar包

    jna-4.5.1 , jna-4.5.1-sources , jna-platform-4.5.1 jar包 JNA全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架(https://github.com/twall/jna)。JNA提供一组Java工具类用于在运行期动态...

    jna-3.3.0 & jna-3.3.0-platform

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C/C++的桥接代码。JNA通过映射Java方法到本地函数,实现了Java与操作系统底层功能的交互,极大地...

    jna&jna-platform4.0版和5.6版本.zip

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用本机库(C、C++等)的函数,无需编写JNI(Java Native Interface)代码。JNA通过提供一种抽象层,使得Java开发者可以相对简单地与操作...

    java实现后台键盘监听所需依赖.zip

    1.java用jintellitype实现后台键盘监听时需要的JIntellitype.dll、JIntellitype64.dll、jintellitype-...2.java用jna实现后台键盘和鼠标监听时需要的jna.jar、platform.jar文件(这两个文件网上找了好久了,亲测有用)

    JNA实例 JNA实例 JNA实例

    ### JNA 实例详解 #### 一、JNA简介与应用场景 JNA(Java Native Access)是一种能够让Java程序调用本地库(Native Libraries)的技术,它允许开发人员在不编写JNI(Java Native Interface)代码的情况下访问本地...

    JNA 4.1.0 官方版

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C语言的JNI(Java Native Interface)代码。JNA 4.1.0是该库的一个官方版本,提供了增强的功能和...

    JNA-5.7.0 jna-platform-5.7.0

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码与本地操作系统功能进行交互,无需编写C语言的动态链接库(DLL)或Java本机接口(JNI)代码。JNA提供了更简单的方式来调用操作系统API,极大地...

    java 后台监控键盘 hook jna Kernel32

    本主题主要关注如何利用Java的JNA库来实现键盘hook功能,通过调用Windows API中的Kernel32.dll相关函数。 JNA(Java Native Access)是Java平台上的一个开源库,它允许Java代码直接调用本地库(如C/C++)的函数,而...

Global site tag (gtag.js) - Google Analytics