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控制键盘”指的是使用Java Native Access (JNA) 库来实现对键盘输入的控制。JNA是Java平台上的一个开源库,它允许Java代码与本机库进行交互,无需编写C/C++的JNI代码。通过JNA,开发者可以直接调用操作...
在Java开发中,模拟鼠标和键盘操作是一项实用的技术,它允许程序员通过代码来模拟用户对计算机的交互行为,比如点击、移动鼠标、按键输入等。这样的功能在自动化测试、远程控制、游戏辅助等方面有着广泛的应用。下面...
在这个场景下,"java 控制鼠标*键盘的 jna 库32位" 提供了这样的功能,通过Java Native Access (JNA) 库来实现。 JNA 是一个Java库,允许Java代码与本地平台API直接交互,而无需编写C代码或使用Java本机接口(JNI)。...
总之,"java控制windows鼠标键盘"项目结合了Java的AWT/SWT库以及可能的WinAPI/JNA技术,为开发者提供了一个全面的解决方案,用于在Windows环境下实现鼠标、键盘和触摸设备的控制。通过这个工具箱,开发者可以轻松地...
仅用JAVA实现全局键盘钩子的功能,很好很强大,学习下
标题中的"JNA_Test.rar.rar"可能是一个包含示例程序或者测试用例的压缩文件,用于演示如何使用JNA进行本地系统调用。由于文件名的重复,这可能是由于压缩错误或有意为之,可能需要解压两次才能得到实际的内容。 ...
本示例"jna_test.rar"着重展示了如何使用JNA在Java中调用C函数,以及实现C函数回调Java方法。 首先,理解JNA的工作原理至关重要。JNA的核心在于映射(mapping),它将Java类和方法映射到本地库中的函数和结构。JNA...
Java监听键盘鼠标全局事件 Java监听键盘鼠标全局事件是指使用Java语言来监听和处理键盘和鼠标事件的技术。这项技术广泛应用于游戏开发、自动化测试、屏幕阅读器等领域。下面是Java监听键盘鼠标全局事件的详细知识点...
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库:jna-4.0.0.jar和jna-4.5.0.jar。这两个版本的差异主要体现在功能的完善和性能的优化上。JNA 4.5.0是较新的版本,相比4.0.0,它可能...
《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全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架(https://github.com/twall/jna)。JNA提供一组Java工具类用于在运行期动态...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C/C++的桥接代码。JNA通过映射Java方法到本地函数,实现了Java与操作系统底层功能的交互,极大地...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用本机库(C、C++等)的函数,无需编写JNI(Java Native Interface)代码。JNA通过提供一种抽象层,使得Java开发者可以相对简单地与操作...
1.java用jintellitype实现后台键盘监听时需要的JIntellitype.dll、JIntellitype64.dll、jintellitype-...2.java用jna实现后台键盘和鼠标监听时需要的jna.jar、platform.jar文件(这两个文件网上找了好久了,亲测有用)
### JNA 实例详解 #### 一、JNA简介与应用场景 JNA(Java Native Access)是一种能够让Java程序调用本地库(Native Libraries)的技术,它允许开发人员在不编写JNI(Java Native Interface)代码的情况下访问本地...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C语言的JNI(Java Native Interface)代码。JNA 4.1.0是该库的一个官方版本,提供了增强的功能和...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码与本地操作系统功能进行交互,无需编写C语言的动态链接库(DLL)或Java本机接口(JNI)代码。JNA提供了更简单的方式来调用操作系统API,极大地...
本主题主要关注如何利用Java的JNA库来实现键盘hook功能,通过调用Windows API中的Kernel32.dll相关函数。 JNA(Java Native Access)是Java平台上的一个开源库,它允许Java代码直接调用本地库(如C/C++)的函数,而...