`
yuebo
  • 浏览: 15889 次
社区版块
存档分类
最新评论

java 实现驱动级键盘事件

    博客分类:
  • java
阅读更多

最近想玩网游,想用按键精灵来自动做一些事情,可惜游戏屏蔽了按键精灵,也没办法用普通的window消息来实现。

郁闷中,偶然发现一个winIO,可以实现驱动级模拟,

http://apps.hi.baidu.com/share/detail/22536342

不过呢本人对vb不熟,于是萌生了改成java版的念头。

 

 

首先是java调用dll,不用说了,最容易的是jnative。

 

首先实现winIO部分api

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;


public class WinIOAPI {
	public static final int CONTROL_PORT = 0x64;
	public static final int DATA_PORT = 0x60;
	static{
		System.loadLibrary("WinIo32");
		JNative.setLoggingEnabled(true);
		if(!InitializeWinIo()){
			System.err.println("Cannot Initialize the WinIO");
			System.exit(1);
		}
		
	}
	
	
	
	public static void KBCWait4IBE() throws Exception{
		int val=0;
		do {
			Pointer p=new Pointer(MemoryBlockFactory.createMemoryBlock(8));
			if(!GetPortVal(CONTROL_PORT,p, 1)){
				System.err.println("Cannot get the Port");
			}
			val = p.getAsInt(0);
			
		} while ((0x2&val)>0);
		
		
		
		
	}
	
	public static boolean InitializeWinIo() {
		
		try{
		 JNative jnative = new JNative("WinIo32","InitializeWinIo");
		 jnative.setRetVal(Type.INT);
		 jnative.invoke();
		 int re=jnative.getRetValAsInt();
		 jnative.dispose();
		 return re>0;
		}catch (Exception e) {
			e.printStackTrace();
			return false;
		}finally{
			
		}
		 
	}
	
	
	public static boolean GetPortVal(int portAddr, Pointer pPortVal, int size) throws Exception{
		
		JNative j2 = new JNative("WinIo32","GetPortVal");
		 j2.setRetVal(Type.INT);
		 
		 j2.setParameter(0, portAddr);
		 j2.setParameter(1, pPortVal);
		 j2.setParameter(2, size);
		 j2.invoke();
		 int re=j2.getRetValAsInt();
		 j2.dispose();
		 return re>0;
		
	}
	
	public static boolean SetPortVal(int portAddr, int portVal, int size) throws Exception{
		
		JNative j2 = new JNative("WinIo32","SetPortVal");
		 j2.setRetVal(Type.INT);
		 j2.setParameter(0, portAddr);
		 j2.setParameter(1,portVal);
		 j2.setParameter(2, size);
		 j2.invoke();
		 int re=j2.getRetValAsInt();
		 j2.dispose();
		 return re>0;
		
	}
	

}

 由于输入的不是VK值,所以我们还需要一个函数来把vk转化为键盘值

import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;


public class User32 extends org.xvolks.jnative.util.User32{
	private static Map<Integer,Integer> keycache=new HashMap();
	public static int MapVirtualKeyA(int key) throws Exception{
		if(!keycache.containsKey(key)){
			JNative jnative=new JNative(DLL_NAME, "MapVirtualKeyA");
			jnative.setRetVal(Type.INT);
			jnative.setParameter(0, key);
			jnative.setParameter(1, 0);
			jnative.invoke();
			int re=jnative.getRetValAsInt();
			keycache.put(key, re);
		}
		return keycache.get(key);
	}
	
	
}

 最后就是按键部分

public class VirtualKeyBoard {
	
	public static void KeyDown(int key) throws Exception{
		WinIOAPI.KBCWait4IBE();
		WinIOAPI.SetPortVal(WinIOAPI.CONTROL_PORT,0xd2,1);
		WinIOAPI.KBCWait4IBE();
		WinIOAPI.SetPortVal(WinIOAPI.DATA_PORT,key,1);
	}
	public static void KeyDownEx(int key) throws Exception{
		WinIOAPI.KBCWait4IBE();
		WinIOAPI.SetPortVal(WinIOAPI.CONTROL_PORT,0xd2,1);
		WinIOAPI.KBCWait4IBE();
		WinIOAPI.SetPortVal(WinIOAPI.DATA_PORT,0xe0,1);
		
		WinIOAPI.KBCWait4IBE();
		WinIOAPI.SetPortVal(WinIOAPI.CONTROL_PORT,0xd2,1);
		WinIOAPI.KBCWait4IBE();
		WinIOAPI.SetPortVal(WinIOAPI.DATA_PORT,key,1);
		
	}
	public static void KeyUpEx(int key) throws Exception{
		WinIOAPI.KBCWait4IBE();
		WinIOAPI.SetPortVal(WinIOAPI.CONTROL_PORT,0xd2,1);
		WinIOAPI.KBCWait4IBE();
		WinIOAPI.SetPortVal(WinIOAPI.DATA_PORT,0xe0,1);
		
		WinIOAPI.KBCWait4IBE();
		WinIOAPI.SetPortVal(WinIOAPI.CONTROL_PORT,0xd2,1);
		WinIOAPI.KBCWait4IBE();
		WinIOAPI.SetPortVal(WinIOAPI.DATA_PORT,(key|0x80),1);
		
	}
	public static void KeyUp(int key) throws Exception{
		WinIOAPI.KBCWait4IBE();
		WinIOAPI.SetPortVal(WinIOAPI.CONTROL_PORT,0xd2,1);
		WinIOAPI.KBCWait4IBE();
		WinIOAPI.SetPortVal(WinIOAPI.DATA_PORT,(key|0x80),1);
		
	}
	
	public static void KeyPress(int key) throws Exception{
		KeyDown(key);
		KeyUp(key);
	}

}

最后附上源码,界面如下


  • key.zip (1.3 MB)
  • 下载次数: 289
  • 大小: 25.1 KB
分享到:
评论
4 楼 alfusen 2017-05-10  
初始化成功了,只是输入没有反应,就是说键盘事件没有被真正的触发。

其实去年我测试成功了的,但现在再用发现不能用了,找不出原因在哪里,哎,不知道是不是

操作系统的原因。
3 楼 just2learn 2017-01-05  
哥们,我下了你的demo,运行报错了:Cannot Initialize the WinIO
请问是哪里没设置好?多谢!
2 楼 zfqzpp 2013-10-03  
同一楼,楼主回答啊。。。。
1 楼 weiwo 2012-06-02  
问一下,那个dll里面的内容你是怎么查看的 谢了 QQ:1228508324

相关推荐

    游戏中可用的键盘消息的驱动级模拟程序

    这种方式能够绕过普通键盘驱动,直接向系统发送键盘事件,以实现更精确、更快捷的输入控制。 描述中提到的“键盘消息的驱动级模拟”在街机模拟器“MAME32K 0.67”中得到验证,这表明该程序能够有效地模拟键盘输入,...

    java开发模拟鼠标键盘操作

    `java.awt.event.KeyEvent`则用来定义键盘事件相关的常量,帮助我们生成键盘事件。 1. **模拟鼠标操作**: 使用`Robot`类,我们可以创建一个`Robot`对象,然后调用其提供的方法来模拟鼠标的行为。例如,`mouseMove...

    Java事件驱动程序设计相关代码

    Java事件驱动程序设计是Java编程中的一个重要概念,它主要用于构建响应用户操作或系统事件的应用程序。在这种模式下,程序并不主动去查询某个状态变化,而是等待事件的发生,并通过事件处理器来响应这些事件。这种...

    java控制windows鼠标键盘

    AWT提供了诸如`Robot`类,它允许我们模拟鼠标和键盘事件。例如,`Robot.createRobot()`方法用于创建一个Robot实例,之后可以调用`mouseMove(int x, int y)`来移动鼠标,`mousePress(int buttonMask)`和`mouseRelease...

    Java-events-driver.rar_java Events_java 事件驱动_事件驱动 java

    例如,Java NIO(非阻塞I/O)库就使用了事件驱动模型,通过Selector监听多个通道上的事件,实现高效的I/O操作。 总的来说,Java事件驱动编程是构建交互式应用程序的关键技术,通过分离事件生成和事件处理,使程序...

    驱动级模拟键盘自动输入

    在描述中提到的Java代码实现模拟键盘输入,意味着使用Java语言编写程序,利用Java提供的API或第三方库来模拟键盘事件。Java本身并不直接支持驱动级的键盘模拟,但可以通过Java的`java.awt.Robot`类或者第三方库如`...

    WinRing0 模拟按键 驱动级 sys lib dll 64 32.rar

    模拟按键的基本原理是利用WinRing0提供的API,直接与键盘驱动进行交互,改变或注入键盘事件。 在64位和32位系统上,WinRing0提供了兼容性的解决方案。由于处理器架构的不同,32位和64位系统对动态链接库(DLL)和...

    Java事件驱动编程相关实例源码.rar

    这些实例与事件驱动程序设计有关,比如事件监听、注册和处理、内部类监听器、匿名内部类监听器、处理简单行为的事件、处理窗口事件、监听器接口适配器、鼠标事件、键盘事件、使用Timer类动画等。

    虚拟键盘鼠标驱动源码

    1. 输入事件生成器:这部分代码会根据用户的需求或预设脚本生成键盘事件,如按键按下、释放等。 2. 驱动接口:驱动程序需要提供一套API供上层应用调用,例如模拟特定键的按下和释放。 3. 设备注册:驱动程序需要在...

    vnc的java实现源码

    VNC(Virtual Network ...通过研究这个开源项目,开发者可以深入了解VNC的工作原理,以及如何用Java实现网络通信、图像处理和事件驱动的程序设计。这不仅可以提升Java编程能力,也能对远程桌面技术有更深入的理解。

    Java数字键盘游戏程序.rar

    【Java数字键盘游戏程序】是一个基于Java编程语言开发的小型游戏。尽管具体的游戏玩法没有在描述中明确提及,但从“数字键盘”这个关键词我们可以推测,这可能是一款与数字输入、数学逻辑或者数字谜题相关的游戏。...

    JAVA键盘事件.pdf

    程序通过实现`KeyListener`接口来处理键盘事件,`implements KeyListener`表明了这一点。这个接口要求实现三个方法:`keyPressed`、`keyReleased`和`keyTyped`。在`keyPressed`方法中,程序通过比较`KeyEvent`对象的...

    JAVA课程设计-计算器可响应键盘

    2. 如何实现键盘监听,理解事件驱动编程的概念。 3. GUI设计原则,如用户体验和视觉一致性。 4. Java中的LookAndFeel机制,了解如何改变应用程序的外观。 总的来说,这个JAVA课程设计项目涵盖了GUI编程的核心概念,...

    Java实现vimJava实现的vimdemo

    因此,Java中的事件监听和处理机制(如java.awt.event包下的各种事件监听器)将被广泛使用,以响应用户的键盘和鼠标输入。 3. **JNI(Java Native Interface)**:由于Vim原生支持许多复杂的文本处理和编辑命令,...

    键盘过滤驱动改键程序

    键盘过滤驱动属于内核模式驱动,因为它们需要在操作系统的核心层运行,以便能够及时响应键盘事件并进行修改。这种驱动程序编写复杂,需要深入理解操作系统的内部工作原理,特别是中断处理和设备驱动模型。 改键功能...

    一个小键盘的代码

    1. **键盘事件处理**:在各种编程语言中,如JavaScript、Python、C#等,都有处理键盘输入的API。例如,JavaScript中的`event.key`或`event.keyCode`可以用来检测用户按下的是哪个键。在Python中,可以使用`pynput`库...

    Java事件处理框架

    - `KeyListener` 处理键盘事件,如按键按下、释放等。 - `ActionListener` 对应于用户执行的特定动作,比如按钮被点击。 - `ItemListener` 应用于复选框和单选按钮的选择变化。 - `FocusListener` 关注组件获得或...

    java实现的坦克大战

    4. **事件驱动编程**:在坦克大战中,游戏的运行依赖于事件的触发,如键盘输入、时间流逝等。Java的事件监听机制在此发挥关键作用,通过注册监听器和处理事件,使得游戏能够实时响应用户的操作。 5. **多线程技术**...

    易语言-BackInC驱动级模拟按键源码【支持USB键盘】

    调用了两种驱动,实现了驱动模拟按键。 其中BackInC汇编调用的驱动,可以支持usb键盘 win7 32位 xp 32位测试成功,其他自测 调用方式打包成模块了,写了个简单的例子 下图为工商安全控件模拟输入。我试了农业银行的...

    Java事件驱动程序设计_java_herdh3w_

    Java事件驱动程序设计相关程序源代码,包括事件和事件源、事件的监听、注册和处理、内部类监听器、匿名内部类监听器、处理简单行为的事件、处理窗口事件、监听器接口适配器、鼠标事件、键盘事件、使用Timer类的动画...

Global site tag (gtag.js) - Google Analytics