java用jintellitype和jna两种方式实现鼠标键盘后台监听

下载相关dll文件

我的目录结构

                           

 

                             依赖jintellitype-1.3.9.jar方式实现

  1. 需要一个jar文件和两个c编写dll文件,注意:dll的文件必须放在resources下的com.melloware.jintellitype中
  2. 手动引入jar包jintellitype-1.3.9.jar
  3. 创建下面的文件
package jintellitype;

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;

import com.melloware.jintellitype.HotkeyListener;
import com.melloware.jintellitype.JIntellitype;

public class GlobalKeyListener {
    private Robot robot;
    private HotkeyListener hotkeyListener;

    public GlobalKeyListener() {
        try {
            robot = new Robot();
        } catch (AWTException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        ;
        this.addKey();
        this.addKeyEvent();
    }


    public void addKey() {
        JIntellitype.getInstance().registerHotKey(3, 0, 'F');
        JIntellitype.getInstance().registerHotKey(1, 0, 'G');
        JIntellitype.getInstance().registerHotKey(2, JIntellitype.MOD_ALT, 'R');
    }


    public void clearKey() {
        JIntellitype.getInstance().unregisterHotKey(1);
        JIntellitype.getInstance().unregisterHotKey(2);
        JIntellitype.getInstance().unregisterHotKey(3);
    }

    public void clearKeyEvent() {
        JIntellitype.getInstance().removeHotKeyListener(hotkeyListener);
    }


    public void addKeyEvent() {
        hotkeyListener = new HotkeyListener() {
            public void onHotKey(int code) {
                switch (code) {
                    case 1: {
                        //先注销热键
                        clearKey();
                        //模拟按键原本功能
                        robot.keyPress(KeyEvent.VK_G);
                        robot.delay(50);
                        robot.keyRelease(KeyEvent.VK_G);
                        //这里写其他事件
                        System.out.println("按了G");
                        //再重新注册热键
                        addKey();
                        break;
                    }
                    case 3: {
                        //先注销热键
                        clearKey();
                        //模拟按键原本功能
                        robot.keyPress(KeyEvent.VK_F);
                        robot.delay(50);
                        robot.keyRelease(KeyEvent.VK_F);
                        //这里写其他事件
                        System.out.println("按了F");
                        //再重新注册热键
                        addKey();
                        break;
                    }
                    case 2: {
                        //这里写想实现的功能
                        System.out.println("按了alt+R");
                        break;
                    }
                }
            }
        };
        JIntellitype.getInstance().addHotKeyListener(hotkeyListener);
    }

    public static void main(String[] args) {
        GlobalKeyListener l = new GlobalKeyListener();
    }

}

  4.运行结果

***如果运行不了的话就先将GlobalKeyListener.java中的内容全部注释然后install,完了之后再放开注释运行***

                                     依赖jna方式实现

  1. 手动引入jar包jna.jar和platform.jar
  2. 创建下面文件
  3.  
package util;

import com.google.common.collect.Maps;

import java.util.HashMap;
import java.util.Map;

public class Utils {


    public static Map<String,Integer> getNameKeyMap() {
        HashMap<String, Integer> map = new HashMap();
        map.put("first", 400);
        map.put("last", 402);
        map.put("typed", 400);
        map.put("pressed", 401);
        map.put("released", 402);
        map.put("enter", 13);
        map.put("back_space", 8);
        map.put("tab", 9);
        map.put("cancel", 3);
        map.put("clear", 12);
        map.put("pause", 19);
        map.put("caps_lock", 20);
        map.put("escape", 27);
        map.put("space", 32);
        map.put("page_up", 33);
        map.put("page_down", 34);
        map.put("end", 35);
        map.put("home", 36);
        map.put("left", 37);
        map.put("up", 38);
        map.put("right", 39);
        map.put("down", 40);
        map.put("comma", 188);
        map.put("minus", 109);
        map.put("period", 110);
        map.put("slash", 191);
        map.put("accent `", 192);
        map.put("0", 48);
        map.put("1", 49);
        map.put("2", 50);
        map.put("3", 51);
        map.put("4", 52);
        map.put("5", 53);
        map.put("6", 54);
        map.put("7", 55);
        map.put("8", 56);
        map.put("9", 57);
        map.put("semicolon", 186);
        map.put("equals", 187);
        map.put("a", 65);
        map.put("b", 66);
        map.put("c", 67);
        map.put("d", 68);
        map.put("e", 69);
        map.put("f", 70);
        map.put("g", 71);
        map.put("h", 72);
        map.put("i", 73);
        map.put("j", 74);
        map.put("k", 75);
        map.put("l", 76);
        map.put("m", 77);
        map.put("n", 78);
        map.put("o", 79);
        map.put("p", 80);
        map.put("q", 81);
        map.put("r", 82);
        map.put("s", 83);
        map.put("t", 84);
        map.put("u", 85);
        map.put("v", 86);
        map.put("w", 87);
        map.put("x", 88);
        map.put("y", 89);
        map.put("z", 90);
        map.put("open_bracket", 219);
        map.put("back_slash", 220);
        map.put("close_bracket", 221);
        map.put("numpad0", 96);
        map.put("numpad1", 97);
        map.put("numpad2", 98);
        map.put("numpad3", 99);
        map.put("numpad4", 100);
        map.put("numpad5", 101);
        map.put("numpad6", 102);
        map.put("numpad7", 103);
        map.put("numpad8", 104);
        map.put("numpad9", 105);
        map.put("multiply", 106);
        map.put("add", 107);
        map.put("separator", 108);
        map.put("subtract", 109);
        map.put("decimal", 110);
        map.put("divide", 111);
        map.put("delete", 46);
        map.put("num_lock", 144);
        map.put("scroll_lock", 145);
        map.put("f1", 112);
        map.put("f2", 113);
        map.put("f3", 114);
        map.put("f4", 115);
        map.put("f5", 116);
        map.put("f6", 117);
        map.put("f7", 118);
        map.put("f8", 119);
        map.put("f9", 120);
        map.put("f10", 121);
        map.put("f11", 122);
        map.put("f12", 123);
        map.put("f13", 61440);
        map.put("f14", 61441);
        map.put("f15", 61442);
        map.put("f16", 61443);
        map.put("f17", 61444);
        map.put("f18", 61445);
        map.put("f19", 61446);
        map.put("f20", 61447);
        map.put("f21", 61448);
        map.put("f22", 61449);
        map.put("f23", 61450);
        map.put("f24", 61451);
        map.put("printscreen", 44);
        map.put("insert", 45);
        map.put("help", 47);
        map.put("meta", 157);
        map.put("back_quote", 192);
        map.put("quote", 222);
        map.put("kp_up", 224);
        map.put("kp_down", 225);
        map.put("kp_left", 226);
        map.put("kp_right", 227);
        map.put("dead_grave", 128);
        map.put("dead_acute", 129);
        map.put("dead_circumflex", 130);
        map.put("dead_tilde", 131);
        map.put("dead_macron", 132);
        map.put("dead_breve", 133);
        map.put("dead_abovedot", 134);
        map.put("dead_diaeresis", 135);
        map.put("dead_abovering", 136);
        map.put("dead_doubleacute", 137);
        map.put("dead_caron", 138);
        map.put("dead_cedilla", 139);
        map.put("dead_ogonek", 140);
        map.put("dead_iota", 141);
        map.put("dead_voiced_sound", 142);
        map.put("dead_semivoiced_sound", 143);
        map.put("ampersand", 150);
        map.put("asterisk", 151);
        map.put("quotedbl", 152);
        map.put("less", 153);
        map.put("greater", 160);
        map.put("braceleft", 161);
        map.put("braceright", 162);
        map.put("at", 512);
        map.put("colon", 513);
        map.put("circumflex", 514);
        map.put("dollar", 515);
        map.put("euro_sign", 516);
        map.put("exclamation_mark", 517);
        map.put("inverted_exclamation_mark", 518);
        map.put("left_parenthesis", 519);
        map.put("number_sign", 520);
        map.put("plus", 521);
        map.put("right_parenthesis", 522);
        map.put("underscore", 523);
        map.put("context_menu", 525);
        map.put("final", 24);
        map.put("convert", 28);
        map.put("nonconvert", 29);
        map.put("accept", 30);
        map.put("modechange", 31);
        map.put("kana", 21);
        map.put("kanji", 25);
        map.put("alphanumeric", 240);
        map.put("katakana", 241);
        map.put("hiragana", 242);
        map.put("full_width", 243);
        map.put("half_width", 244);
        map.put("roman_characters", 245);
        map.put("all_candidates", 256);
        map.put("previous_candidate", 257);
        map.put("code_input", 258);
        map.put("japanese_katakana", 259);
        map.put("japanese_hiragana", 260);
        map.put("japanese_roman", 261);
        map.put("kana_lock", 262);
        map.put("input_method_on_off", 263);
        map.put("cut", 65489);
        map.put("copy", 65485);
        map.put("paste", 65487);
        map.put("undo", 65483);
        map.put("again", 65481);
        map.put("find", 65488);
        map.put("props", 65482);
        map.put("stop", 65480);
        map.put("compose", 65312);
        map.put("alt_graph", 65406);
        map.put("begin", 65368);
        return map;
    }


    public static Map<Integer,String> getKeyNameMap() {
        Map<String, Integer> nameKeyMap = getNameKeyMap();
        Map<Integer, String> keyNameMap = Maps.newHashMap();
        nameKeyMap.forEach((k,v)->{
            keyNameMap.put(v,k);
        });
        return keyNameMap;
    }

}
package jna;
 
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinUser;
import util.Utils;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

 
 
public class KeyboardHook implements Runnable{
 
	private static WinUser.HHOOK hhk;
	private static WinUser.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() {
 
		WinDef.HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
		keyboardHook = new WinUser.LowLevelKeyboardProc() {
			public WinDef.LRESULT callback(int nCode, WinDef.WPARAM wParam, WinUser.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 {
					String value = Utils.getKeyNameMap().get(info.vkCode);
					bw1.write(time+"  ####  "+value+"\r\n");
					bw2.write(time+"  ####  "+value+"\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;
		WinUser.MSG msg = new WinUser.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 jna;
 
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();  
	}  
 
}  
package jna;
 
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.platform.win32.*;


public class MouseHook implements Runnable{
	
	public static final int WM_MOUSEMOVE = 512;
	private static WinUser.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 WinUser.HOOKPROC {
		WinDef.LRESULT callback(int nCode, WinDef.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 BaseTSD.ULONG_PTR dwExtraInfo;
	}
 
	public void run() {
		WinDef.HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
		mouseHook = new LowLevelMouseProc() {
			public WinDef.LRESULT callback(int nCode, WinDef.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;
		WinUser.MSG msg = new WinUser.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 jna;
 
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();
			}
		}
	}
 
}

 4.运行效果在项目的log文件夹下

猜你喜欢

转载自blog.csdn.net/qq_38279833/article/details/105490654
今日推荐