通过jna简单实现java后台监听键盘触发修改系统时间
来源:互联网 发布:腾讯企业邮箱软件下载 编辑:程序博客网 时间:2024/06/06 19:15
由于玩某网游需要在出副本时等一分钟,而修改系统时间+1分钟可以提前出副本,避免麻烦写了个java后台监听键盘触发修改系统时间的脚本,当按下设置好的键盘组合即调用修改函数。
修改时间的函数代码如下(调用CMD命令):
import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;public class changeTime{static void plus_min(int min) throws IOException {Long millis = Long.valueOf(System.currentTimeMillis() + 60000*min);Calendar c = Calendar.getInstance();c.setTimeInMillis(millis.longValue());Date newDate = c.getTime();SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd");System.out.println(date.format(newDate));SimpleDateFormat time = new SimpleDateFormat("HH:mm:ss");System.out.println(time.format(newDate));String cmd = " cmd /c date " + date.format(newDate);Runtime.getRuntime().exec(cmd);cmd = " cmd /c time " + time.format(newDate);System.out.println(cmd);Runtime.getRuntime().exec(cmd);}}
后台通过jna实现的键盘监听代码如下(当按下的键盘组合符合设置好的条件,调用上述函数):
import com.sun.jna.Pointer;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.WinDef.LPARAM;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;import java.io.IOException;import java.util.ArrayList;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;/** Sample implementation of a low-level keyboard hook on W32. */public class KeyHook {private static volatile boolean quit;private static HHOOK hhk;private static LowLevelKeyboardProc keyboardHook;//设置按键组合的vkCode,具体vkCode与键盘的对照表可百度private static ArrayList<Integer> keyList=new ArrayList<Integer>(){{add(65); add(83);add(68);add(38);}};private static ArrayList<Integer> inputList=new ArrayList<Integer>();private static Long listSetTime;private static int min=1; //每次增加一分钟static void setJframe(){ //窗口界面JFrame jframe=new JFrame("修改系统时间"); jframe.setSize(300,200); jframe.setLocation(550, 250); jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel field=new JLabel(); field.setBounds(30, 20, 400, 100); field.setText("同时按下A,S,D,↑ 系统时间+1分钟"); jframe.setLayout(null);JButton button=new JButton("关闭"); jframe.add(field); jframe.add(button);button.setBounds(60,120,150,30);button.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){ System.exit(0);}}); jframe.setLayout(null); jframe.setResizable(true); jframe.setVisible(true);}public static void setList(int code,ArrayList<Integer> list){if(!list.contains(code)){ if(list.size()<=keyList.size()){ list.add(code);}else{ list.remove(0); list.add(code);} } } public static boolean isGetAllKey(){boolean b=true;for(int i=0;i<keyList.size();i++){if(!inputList.contains(keyList.get(i))){b=false;break;}}return b;}public static void main(String[] args) {setJframe();final User32 lib = User32.INSTANCE;HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);keyboardHook = new LowLevelKeyboardProc() {@Overridepublic LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) {if (nCode >= 0) {switch(wParam.intValue()) {case WinUser.WM_KEYUP:case WinUser.WM_KEYDOWN:case WinUser.WM_SYSKEYUP:case WinUser.WM_SYSKEYDOWN:if (!keyList.contains(info.vkCode)) {inputList.clear();//System.out.println("key="+info.vkCode);} else {if(inputList.size()==0){listSetTime=System.currentTimeMillis();}setList(info.vkCode, inputList);//System.err.println("in callback, key=" + info.vkCode);if (isGetAllKey()) {if(System.currentTimeMillis()-listSetTime<50) {quit = true;}else{inputList.clear();}}}}} Pointer ptr = info.getPointer();long peer = Pointer.nativeValue(ptr);return lib.CallNextHookEx(hhk, nCode, wParam, new LPARAM(peer));}};hhk = lib.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL, keyboardHook, hMod, 0);new Thread() {@Overridepublic void run() {while (true) {try {Thread.sleep(200);} catch (Exception e) {}//System.err.println("unhook and exit");//lib.UnhookWindowsHookEx(hhk);if(quit) {try {changeTime.plus_min(min);} catch (IOException e) {e.printStackTrace();}quit = false;inputList.clear();//System.exit(0);}}}}.start();// This bit never returns from GetMessageint 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);}}
运行可弹出界面(保持界面不关闭,则后台持续监听键盘事件):
打包好的项目下载地址如下,已包含对应的jna包,可直接运行:
http://download.csdn.net/download/capricio/10130898阅读全文
0 0
- 通过jna简单实现java后台监听键盘触发修改系统时间
- java实现鼠标和键盘动作后台监听
- java实现鼠标和键盘动作后台监听(未测试)
- java实现鼠标和键盘动作后台监听 (未测试)
- java实现鼠标和键盘动作后台监听
- java实现鼠标和键盘动作后台监听
- Java 通过 JNA (Java Native Access) 获取、设置 Windows 操作系统的文件创建时间、文件修改时间、文件访问时间
- C和Java JNA获取系统空闲时间 --GetLastInputInfo 函数
- Android实现后台长期监听时间变化
- Primefaces中通过RemoteCommand实现JS触发调用Java后台方法
- 通过php修改系统时间
- JNA介绍及使用JNA监听鼠标实现
- java通过 JNA调用 so
- JAVA调用JNA修改桌面壁纸
- java修改系统时间
- Java 实现 Hook 对鼠标键盘监听
- 事件监听以及事件触发的简单实现流程
- Java jna 使用简单小结
- Redis在项目中的具体运用
- 严选识物前端页面学习
- logback的使用和logback.xml详解
- leakcanary内存优化框架源码解析
- OpenCV玩九宫格数独(一)——九宫格图片中提取数字
- 通过jna简单实现java后台监听键盘触发修改系统时间
- clang -rewrite-objc的使用点滴
- CoGAN 和 SeGAN
- 如何打造千万级Feed流系统?阿里数据库技术解读
- 结构体的新理解
- C# partial修饰词的使用
- TabLayout设置下划线(Indicator)宽度
- Linux配置Apache虚拟主机VirtualHost
- 已有项目适配iOS11、iPhoneX