Java监听键盘鼠标全局事件
事件处理4

基本概念
事件源(event source):产生事件的对象。如在 一个按钮上单击鼠标时,该按钮是事件源,会产 生一个ActionEvent类型的事件。
事件监听者(Listener):Java程序把事件进行处理 的方法放在一个类对象中,这个类对象就是事件 监听者。事件源通过调用相应的方法将某个对象 设置为自己的监听者,监听者有专门的方法来处 理事件。
常用方法:
public String getActionCommand()返回与此动作相关的命 令字符串。
public long getWhen()返回发生此事件时的时间戳。 public int getModifiers()返回发生此动作事件期间按下的组
合键。 public Object getSource() 最初发生 Event 的对象。
} public static void main(String[] args){ GUIDemo8 d=new GUIDemo8(); }
}
选项事件类 ItemEvent
当用户在窗口中的带有可选择功能的组件中进行 选取操作时所发生的事件.
选项事件ItemEvent的监听者是ItemListener. 该接口中提供的事件处理方法只有一个 itemStateChanged(ItemEvent e),当组件中 的选项状态改变时,将调用该方法.
public GUIDemo8() { jta=new JTextArea(); jp1=new JPanel(); String[] chatters={"红红","白白","蓝蓝"}; jcb=new JComboBox(chatters); jtf=new JTextField(10); jb=new JButton("发送"); jsp=new JScrollPane(jta);
jnativehook 用法

jnativehook 是一个 Java 库,它提供全局的键盘和鼠标事件侦听功能。
以下是使用 jnativehook 的基本步骤:1. 下载和安装 jnativehook:首先,你需要从 jnativehook 的官方网站下载相关的库文件,并将其添加到你的 Java 项目的类路径中。
2. 创建一个监听器:在 Java 项目中创建一个监听器类,该类将实现 jnativehook 的接口来处理各种事件。
你可以创建一个名为 MyKeyListener 的类,并让它实现 NativeKeyListener 接口。
以下是一个简单的示例:java复制代码import org.jnativehook.GlobalScreen;import org.jnativehook.NativeHookException;import org.jnativehook.keyboard.NativeKeyEvent;import org.jnativehook.keyboard.NativeKeyListener;public class MyKeyListener implements NativeKeyListener {public void nativeKeyPressed(NativeKeyEvent e) {System.out.println("Key Pressed: " +NativeKeyEvent.getKeyText(e.getKeyCode()));}public void nativeKeyReleased(NativeKeyEvent e) {System.out.println("Key Released: " +NativeKeyEvent.getKeyText(e.getKeyCode()));}public void nativeKeyTyped(NativeKeyEvent e) {System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode()));}public static void main(String[] args) {try {GlobalScreen.registerNativeHook();} catch (NativeHookException ex) {System.err.println("There was a problem registering the native hook.");System.err.println(ex.getMessage());System.exit(1);}GlobalScreen.addNativeKeyListener(new MyKeyListener());}}在这个示例中,我们创建了一个名为 MyKeyListener 的类,并实现了 NativeKeyListener 接口。
JAVA 如何截获全局鼠标事件

二. 按使用范围分类,主要有线程钩子和系统钩子
(1) 线程钩子监视指定线程的事件消息。
(2) 系统钩子监视系统中的所有线程的事件消息。因为系统钩子会影响系统中所有的应用程序,所以钩子函数必须放在独立的动态链接库(DLL)
中。这是系统钩子和线程钩子很大的不同之处。
几点需要说明的地方:
(1) 如果对于同一事件(如鼠标消息)既安装了线程钩子又安装了系统钩子,那么系统会自动先调用线程钩子,然后调用系统钩子。
(2)对同一事件消息可安装多个钩子处理过程,这些钩子处理过程形成了钩子链。当前钩子处理结束后应把钩子信息传递给下一个钩子函数。而且最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。
(3) 钩子特别是系统钩子会消耗消息处理时间,降低系统性能。只有在必要的时候才安装钩子,在使用完毕后要及时卸载。
JAVA 如何截获全局鼠标事件
Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。可见,利用钩子可以实现许多特殊而有用的功能。因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。
1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;
2. 完成系统指令;
3. 来自系统消息队列中的移动鼠标,键盘事件;
Java实现Hook对鼠标键盘监听-沐早SNOTEBOOK-CSDN博客

Java实现Hook对鼠标键盘监听-沐早SNOTEBOOK-CSDN博客Java 实现 Hook 对鼠标键盘监听收藏Java 实现全局(全操作系统)的鼠标和键盘监控,使用的是SWT Win32 Extension 项目,在以前若使用Java恐怕是很难实现的!SWT Win32 Extension 让Java拥有了许多对操作系统底层操作的功能!注:本程序需要SWT Win32 Extension支持?以下两个例子是:(一)鼠标Hookview plaincopy to clipboardprint?1.import org.sf.feeling.swt.win32.extension.hook.Hook;2.import org.sf.feeling.swt.win32.extension.hook.data.Hook Data;3.import org.sf.feeling.swt.win32.extension.hook.data.Mous eHookData;4.import org.sf.feeling.swt.win32.extension.hook.listener.Ho okEventListener;5.6.public class HotMouse {7.8.public static void main(String[] args) {9.Hook.MOUSE.addListener(new HookEventListener() {10.public void acceptHookData(HookData hookData) {11.if (hookData != null) {12.//System.out.println("Mouse Point X = " + ((MouseHo okData)hookData).getPointX());13.//System.err.println("Mouse Point Y =" + ((MouseHookData)hookData).getPointY());14.System.err.println(((MouseHookData)hookData).getPoi ntX()+"," + ((MouseHookData)hookData).getPointY());15.}16.if (hookData.getWParam() == 513) { System.out.p rintln("left button pressed");// left button pressed17.} else if (hookData.getWParam() == 514) { System.out .println("left button released");// left button released18.} else if (hookData.getWParam() == 516) { System.out .println("right button pressed");// right button pressed19.} else if (hookData.getWParam() == 517) { System.out .println("right button");// right button20.} else if (hookData.getWParam() == 519) { System.out .println("middle button 519");// middle button21.} else if (hookData.getWParam() == 520) { System.out .println("middle button 520");// middle button22.}23.}24.});25.Hook.MOUSE.install();26.}27.28.}(二)键盘Hookview plaincopy to clipboardprint?1.import org.sf.feeling.swt.win32.extension.hook.Hook;2.import org.sf.feeling.swt.win32.extension.hook.data.HookData;3.import org.sf.feeling.swt.win32.extension.hook.data.Keyb oardHookData;4.import org.sf.feeling.swt.win32.extension.hook.listener.Ho okEventListener;5.6.public class HotKey {7.public static void main(final String[] args) {8.Hook.KEYBOARD.addListener(new HookEventListener(){// @Override9.public void acceptHookData(HookData arg0) {10.KeyboardHookData KHD = ((KeyboardHookData)arg0) ;11.System.out.println(KHD.getWParam()+" - "+KHD.getTr ansitionState()); //Print code12.if( KHD.getScanCode() == 29 && KHD.getTransitionSt ate()){ //按下Ctrl執行動作13.System.out.println("Hotting");14.}else if( KHD.getScanCode() == 1 ){ //按下[ESC]結束15.System.exit(0);16.}17.}});18.Hook.KEYBOARD.install(); //註冊事件19.}20.}以上两个例子源于:这里要感谢!感谢!。
java中textfield中清空内容的方法

一、介绍Java中TextField控件在Java编程中,TextField是一个常用的用户界面控件,用于接收用户输入的文本数据。
它通常用于表单、登录页面、搜索框等场景中,是与用户进行交互的重要组成部分。
二、TextField中清空内容的方法在实际的开发中,经常会遇到需要清空TextField中内容的情况,下面将介绍几种常用的方法。
1. 使用setText方法通过调用TextField的setText方法,可以将其内容设置为空字符串,从而实现清空的效果。
示例代码如下:```javatextField.setText("");```这样就可以清空textField中的内容。
2. 监听键盘事件另一种常见的做法是通过监听键盘事件,在用户按下特定键(如Delete键)时清空TextField中的内容。
示例代码如下:```javatextField.addKeyListener(new KeyAdapter() {Overridepublic void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_DELETE) {textField.setText("");}}});```这样,当用户按下Delete键时,TextField中的内容就会被清空。
3. 使用DocumentListener还可以通过监听Document的变化,在用户输入内容后立即清空TextField中的内容。
示例代码如下:```javatextField.getDocument().addDocumentListener(new DocumentListener() {Overridepublic void removeUpdate(DocumentEvent e) {textField.setText("");}Overridepublic void insertUpdate(DocumentEvent e) {textField.setText("");}Overridepublic void changedUpdate(DocumentEvent e) {textField.setText("");}});```这样,无论用户是删除已有内容还是输入新内容,TextField中的内容都会被立即清空。
JAVA事件处理机制

JAVA事件处理机制JAVA事件处理机制是指在JAVA编程中对事件进行监听和响应的一种机制。
在JAVA中,事件是指用户在程序运行过程中进行的各种操作,如鼠标点击、键盘输入、窗口关闭等。
通过事件处理机制,程序可以在特定事件发生时触发相应的操作,从而实现与用户的交互。
在JAVA中,事件处理机制主要涉及到以下几个方面:事件源、事件监听器、事件对象和事件处理器。
事件源是指能够触发事件的对象,例如按钮、文本框等;事件监听器是指用来监听事件的对象,它实现了相应的事件监听接口;事件对象是指封装了事件源和事件信息的对象,它包含了发生事件的相关属性;事件处理器是指在事件被触发时需要执行的操作,可以通过事件监听器来定义。
事件处理机制通常包括以下几个步骤:1.创建事件源对象:例如创建一个按钮对象。
2.创建事件监听器对象:实现相应的事件监听接口,并重写事件处理方法。
3.将事件监听器对象注册到事件源对象中:通过调用事件源对象的方法将事件监听器对象注册到事件源对象中,使其能够监听事件源对象的事件。
4.触发事件:用户进行相应操作后,事件源对象会触发相应的事件。
5.事件源对象通知事件监听器对象:事件源对象会调用事件监听器对象的相应方法,将事件对象作为参数传递给事件监听器对象。
6.事件监听器对象执行操作:事件监听器对象接收到事件对象后,根据事件对象中的信息执行相应的操作。
通过事件处理机制,可以实现丰富的用户交互功能。
例如,在一个图形界面程序中,用户点击按钮时,可以触发按钮的点击事件,然后执行相应的操作,如弹出对话框、刷新界面等。
又如,用户在文本框中输入内容时,可以触发文本框的输入事件,然后进行相应的校验、处理等操作。
JAVA提供了丰富的事件监听接口和类库,使得事件处理变得更加方便。
例如,对于鼠标事件,可以使用MouseListener接口和MouseAdapter适配器类来实现对鼠标事件的监听和处理。
对于键盘事件,可以使用KeyListener接口和KeyAdapter适配器类来实现对键盘事件的监听和处理。
java listener几个功能例子

java listener几个功能例子Java中的Listener通常用于监听和处理事件。
下面是一些Java Listener的示例:1. ActionListener:用于监听和处理按钮点击事件。
```javaimport ;import ;import ;import ;public class ButtonExample {public static void main(String[] args) {JFrame frame = new JFrame("Button Example");JButton button = new JButton("Click me!");(new ActionListener() {public void actionPerformed(ActionEvent e) {("Button clicked!");}});().add(button);(300, 200);(_ON_CLOSE);(true);}}```2. MouseListener:用于监听和处理鼠标事件。
```javaimport ;import ;import ;import ;public class MouseExample {public static void main(String[] args) {JFrame frame = new JFrame("Mouse Example");JPanel panel = new JPanel();(new MouseListener() {public void mouseClicked(MouseEvent e) { ("Mouse clicked!");}public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} });().add(panel);(300, 200);(_ON_CLOSE);(true);}}```3. KeyListener:用于监听和处理键盘事件。
java listener原理

java listener原理Java中的Listener是指监听器,它可以用来监听各种事件,例如鼠标点击、键盘输入、窗口关闭等。
Listener应用广泛,几乎可以植入在Java应用程序的任何部分。
在本文中,我们将深入探讨Java Listener的原理,以帮助我们更好地理解和应用它。
1. Listener的概念和种类Listener是一种Java编程语言中的一类对象,它用于监听和响应特定类型的事件。
Java中包含多种Listener,例如鼠标监听器(MouseEvent)、键盘监听器(KeyListener)、窗口监听器(WindowListener)等。
每种Listener都有其特定的方法和事件,可以在需要的时候进行注册和使用。
2. Listener的工作原理Listener的工作原理可以用以下几个步骤来说明:- 创建Listener对象:首先需要创建一个Listener对象,该对象需要实现Listener接口,同时需要重写该接口定义的相应方法。
- 注册Listener对象:注册Listener对象是将Listener对象与要监听的事件进行关联,这是Listener对象可以侦听到关联事件的关键。
- 等待事件发生:Listener对象需要等待指定类型的事件发生,然后触发相应的方法来处理事件。
- 响应事件:Listener对象需要响应已经接收到的事件,例如在鼠标单击事件中,可以在相应的方法中添加单击处理代码。
3. Listener的应用Listener可以应用于很多场景,例如:- 检测用户输入:通过监听键盘监听器,可以检测用户输入特定的按键,例如删除、回车等,从而响应用户输入事件。
- 监听鼠标移动:通过监听鼠标监听器,可以检测鼠标移动的轨迹,从而实现游戏中的怪物跟随鼠标移动的效果。
- 控制窗口关闭:通过监听窗口监听器,可以实现窗口关闭时执行特定的代码,例如保存打开的文件等。
- 实时更新数据:通过监听数据源,可以实现数据的实时更新,例如数据库数据更新时可以通知监听器进行及时更新。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <windows.h>#include "SysHook.h"#include <jni.h>HINSTANCEhInst = NULL;JavaVM * jvm = NULL;jobject hookObj_kb = NULL;jobject hookObj_ms = NULL;jobject g_kl = NULL;jmethodID processKeyID_kb = NULL;jmethodID processKeyID_ms = NULL;DWORDhookThreadId = 0;LONGg_mouseLocX = -1;// x-location of mouse positionLONGg_mouseLocY = -1;// y-location of mouse positionextern"C"BOOLAPIENTRY DllMain(HINSTANCE_hInst,DWORDreason,LPVOIDreserved){switch(reason){caseDLL_PROCESS_ATTACH:printf("C++: DllMain - DLL_PROCESS_ATTACH.\n");hInst = _hInst;break;default:break;}returnTRUE;}LRESULTCALLBACK MouseTracker(intnCode,WPARAMwParam,LPARAMlParam){JNIEnv * env;KBDLLHOOKSTRUCT * p = (KBDLLHOOKSTRUCT *)lParam;if(jvm->AttachCurrentThread((void**)&env, NULL) >= 0){if(nCode==HC_ACTION){MOUSEHOOKSTRUCT* pStruct = (MOUSEHOOKSTRUCT*)lParam;if(pStruct->pt.x != g_mouseLocX || pStruct->pt.y != g_mouseLocY){env->CallVoidMethod(hookObj_ms, processKeyID_ms, (jint)pStruct->pt.x,(jint)pStruct->pt.y, g_kl);g_mouseLocX = pStruct->pt.x;g_mouseLocY = pStruct->pt.y;}}}else{printf("C++: LowLevelKeyboardProc - Error on the attach current thread.\n");}returnCallNextHookEx(NULL, nCode, wParam, lParam);}LRESULTCALLBACKLowLevelKeyboardProc(intnCode,WPARAMwParam,LPARAMlParam){JNIEnv * env;KBDLLHOOKSTRUCT * p = (KBDLLHOOKSTRUCT *)lParam;if(jvm->AttachCurrentThread((void**)&env, NULL) >= 0){switch(wParam){caseWM_KEYDOWN:caseWM_SYSKEYDOWN:env->CallVoidMethod(hookObj_kb, processKeyID_kb, (jboolean)TRUE, p->vkCode,g_kl);break;caseWM_KEYUP:caseWM_SYSKEYUP:env->CallVoidMethod(hookObj_kb, processKeyID_kb, (jboolean)FALSE, p->vkCode,g_kl);break;default:break;}}else{printf("C++: LowLevelKeyboardProc - Error on the attach current thread.\n");}returnCallNextHookEx(NULL, nCode, wParam, lParam);}voidMsgLoop(){MSG message;while(GetMessage(&message, NULL, 0, 0)){TranslateMessage(&message);DispatchMessage(&message);}}JNIEXPORTvoidJNICALL Java_SysHook_registerHook(JNIEnv * env, jobject obj,jobject kl){HHOOKhookHandle_ms = SetWindowsHookEx(WH_MOUSE_LL, MouseTracker, hInst, 0);HHOOKhookHandle_kb = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInst, 0);g_kl = kl;if(hookHandle_ms == NULL){printf("C++: Java_SysHook_registerKeyHook - Hook failed!\n"); return;}else{printf("C++: Java_SysHook_registerKeyHook - Hook successful\n");}if(hookHandle_kb == NULL){printf("C++: Java_SysHook_registerKeyHook - Hook failed!\n"); return;}else{printf("C++: Java_SysHook_registerKeyHook - Hook successful\n");}hookObj_kb = env->NewGlobalRef(obj);jclass cls_kb = env->GetObjectClass(hookObj_kb);processKeyID_kb = env->GetMethodID(cls_kb,"processKey","(ZILGlobalEventListener;)V") ;hookObj_ms = env->NewGlobalRef(obj);jclass cls_ms = env->GetObjectClass(hookObj_ms);processKeyID_ms = env->GetMethodID(cls_ms,"mouseMoved","(IILGlobalEventListener;)V") ;env->GetJavaVM(&jvm);hookThreadId = GetCurrentThreadId();MsgLoop();if(!UnhookWindowsHookEx(hookHandle_kb)){printf("C++: Java_SysHook_registerKeyHook - Unhook failed\n");}else{printf("C++: Java_SysHook_registerKeyHook - Unhook successful\n"); }if(!UnhookWindowsHookEx(hookHandle_ms)){printf("C++: Java_SysHook_registerKeyHook - Unhook failed\n");}else{printf("C++: Java_SysHook_registerKeyHook - Unhook successful\n"); }}JNIEXPORTvoidJNICALL Java_SysHook_unRegisterHook(JNIEnv *env, jobject object){if(hookThreadId == 0)return;printf("C++: Java_SysHook_unRegisterKeyHook - call PostThreadMessage.\n");PostThreadMessage(hookThreadId, WM_QUIT, 0, 0L);}SysHook.h:1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 /* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class SysHook */#ifndef _Included_SysHook#define _Included_SysHook#ifdef __cplusplusextern"C"{#endif/** Class: SysHook* Method: registerHook* Signature: (LGlobalEventListener;)V*/JNIEXPORTvoidJNICALL Java_SysHook_registerHook (JNIEnv *, jobject, jobject);/** Class: SysHook1 4 1 5 1 6 1 7 1 8 1 92 0 2 1 2 2 23 24 25 26 27 * Method: unRegisterHook* Signature: ()V*/JNIEXPORTvoidJNICALL Java_SysHook_unRegisterHook (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endifKeyboardEventListener.java1 2 3 4 5 6 7 8 9 1 0 1 1 1importjava.util.*; publicinterfaceKeyboardEventListenerextendsEventListener { publicvoidGlobalKeyPressed(KeyboardEvent event); publicvoidGlobalKeyReleased(KeyboardEvent event);}classKeyboardEventextendsEventObject { privatestaticfinallongserialVersionUID = 2341653211621224652L;booleants, ap, ek;intvk;publicKeyboardEvent(Objectsource,booleants,intvk,booleanap,booleanek) {super(source);2 13 14 15 16 17 18 19 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3this.ts = ts;this.vk = vk;this.ap = ap;this.ek = ek;}publicbooleangetTransitionState() { returnts;}publiclonggetVirtualKeyCode() {returnvk;}publicbooleanisAltPressed() {returnap;}publicbooleanisExtendedKey() {returnek;}publicbooleanequals(KeyboardEvent event) { if(event.getVirtualKeyCode() == vk) {if(event.isExtendedKey() == ek) {if(event.isAltPressed() == ap) { returntrue;}}}returnfalse;}}435363738394414243444546474849 MouseEventListenter.java1 2 3 4 5 6 7 8 9 1 0 importjava.util.*; publicinterfaceMouseEventListenerextendsEventListene r {publicvoidGlobalMouseX(MouseEvent event); publicvoidGlobalMouseY(MouseEvent event);}classMouseEventextendsEventObject { privatestaticfinallongserialVersionUID = 14654L; intcord_x, cord_y;publicMouseEvent(Object source,intcord_x,intcord_y) { super(source);1 1 12 13 14 15 16 17 18 19 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 this.cord_x = cord_x; this.cord_y = cord_y; }publicintgetMouseX() { returncord_x;}publicintgetMouseY() { returncord_y;}}GlobalEventListener.java :1 2 3 4 5 6 publicclassGlobalEventListener { PoolHook pt; publicGlobalEventListener() {pt =newPoolHook(this);pt.start();}7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3protectedjavax.swing.event.EventListenerList listenerList =newjavax.swing.event.EventListenerList(); publicvoidaddKeyboardEventListener(KeyboardEventListener listener) {listenerList.add(KeyboardEventListener.class, listener);}publicvoidremoveKeyboardEventListener(KeyboardEventListener listener) {listenerList.remove(KeyboardEventListener.class, listener);}publicvoidaddMouseEventListener(MouseEventListener listener) { listenerList.add(MouseEventListener.class, listener);}publicvoidremoveMouseEventListener(MouseEventListener listener) { listenerList.remove(MouseEventListener.class, listener);}voidkeyPressed(KeyboardEvent event) {Object[] listeners = listenerList.getListenerList();for(inti =0; i < listeners.length; i +=2) {if(listeners[i] == KeyboardEventListener.class) { ((KeyboardEventListener) listeners[i +1]).GlobalKeyPressed(event);}}}voidmouseMoved(MouseEvent event) {Object[] listeners = listenerList.getListenerList();for(inti =0; i < listeners.length; i +=2) {if(listeners[i] == MouseEventListener.class) { ((MouseEventListener) listeners[i +1]).GlobalMouseX(event); ((MouseEventListener) listeners[i +1]).GlobalMouseY(event);}}}voidkeyReleased(KeyboardEvent event) {Object[] listeners = listenerList.getListenerList();for(inti =0; i < listeners.length; i +=2) {if(listeners[i] == KeyboardEventListener.class) { ((KeyboardEventListener) listeners[i +1]).GlobalKeyReleased(event);}}}}0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5535455565758 SysHook.java:1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 classPoolHookextendsThread {SysHook hook;GlobalEventListener g_gl;PoolHook(GlobalEventListener gl) {g_gl = gl;}publicvoidrun() {hook =newSysHook();hook.registerHook(g_gl);}}classSysHook {static{System.loadLibrary("SysHook");}voidprocessKey(booleants,intvk, GlobalEventListener gl) { KeyboardEvent event =newKeyboardEvent(this, ts, vk,false,false);gl.keyPressed(event);}voidmouseMoved(intcord_x,intcord_y, GlobalEventListener gl) { MouseEvent event =newMouseEvent(this, cord_x, cord_y);gl.mouseMoved(event);}nativevoidregisterHook(GlobalEventListener gl); nativevoidunRegisterHook();}2122232425262728293313233343536 Example.java:1 2 3 4 5 6 7 8 publicclassExampleimplementsKeyboardEventListener, MouseEventListener {staticGlobalEventListener gl;publicstaticvoidmain(String[] args)throwsException { Example inst =newExample();gl =newGlobalEventListener();gl.addKeyboardEventListener(inst);gl.addMouseEventListener(inst);1 0 1 1 12 13 14 15 16 17 18 19 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3@OverridepublicvoidGlobalKeyPressed(KeyboardEvent event) {System.out.println("Key Pressed: "+ event.getVirtualKeyCode()); }@OverridepublicvoidGlobalKeyReleased(KeyboardEvent event) {}@OverridepublicvoidGlobalMouseX(MouseEvent event) {System.out.println("Mouse X: "+ event.getMouseX());}@OverridepublicvoidGlobalMouseY(MouseEvent event) {System.out.println("Mouse Y: "+ event.getMouseY());}}3233C++文件需要用Visual Studio编译为你的目标系统的DLL文件。