最近想玩网游,想用按键精灵来自动做一些事情,可惜游戏屏蔽了按键精灵,也没办法用普通的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);
}
}
最后附上源码,界面如下
- 大小: 25.1 KB
分享到:
相关推荐
这种方式能够绕过普通键盘驱动,直接向系统发送键盘事件,以实现更精确、更快捷的输入控制。 描述中提到的“键盘消息的驱动级模拟”在街机模拟器“MAME32K 0.67”中得到验证,这表明该程序能够有效地模拟键盘输入,...
`java.awt.event.KeyEvent`则用来定义键盘事件相关的常量,帮助我们生成键盘事件。 1. **模拟鼠标操作**: 使用`Robot`类,我们可以创建一个`Robot`对象,然后调用其提供的方法来模拟鼠标的行为。例如,`mouseMove...
Java事件驱动程序设计是Java编程中的一个重要概念,它主要用于构建响应用户操作或系统事件的应用程序。在这种模式下,程序并不主动去查询某个状态变化,而是等待事件的发生,并通过事件处理器来响应这些事件。这种...
AWT提供了诸如`Robot`类,它允许我们模拟鼠标和键盘事件。例如,`Robot.createRobot()`方法用于创建一个Robot实例,之后可以调用`mouseMove(int x, int y)`来移动鼠标,`mousePress(int buttonMask)`和`mouseRelease...
例如,Java NIO(非阻塞I/O)库就使用了事件驱动模型,通过Selector监听多个通道上的事件,实现高效的I/O操作。 总的来说,Java事件驱动编程是构建交互式应用程序的关键技术,通过分离事件生成和事件处理,使程序...
在描述中提到的Java代码实现模拟键盘输入,意味着使用Java语言编写程序,利用Java提供的API或第三方库来模拟键盘事件。Java本身并不直接支持驱动级的键盘模拟,但可以通过Java的`java.awt.Robot`类或者第三方库如`...
模拟按键的基本原理是利用WinRing0提供的API,直接与键盘驱动进行交互,改变或注入键盘事件。 在64位和32位系统上,WinRing0提供了兼容性的解决方案。由于处理器架构的不同,32位和64位系统对动态链接库(DLL)和...
这些实例与事件驱动程序设计有关,比如事件监听、注册和处理、内部类监听器、匿名内部类监听器、处理简单行为的事件、处理窗口事件、监听器接口适配器、鼠标事件、键盘事件、使用Timer类动画等。
1. 输入事件生成器:这部分代码会根据用户的需求或预设脚本生成键盘事件,如按键按下、释放等。 2. 驱动接口:驱动程序需要提供一套API供上层应用调用,例如模拟特定键的按下和释放。 3. 设备注册:驱动程序需要在...
VNC(Virtual Network ...通过研究这个开源项目,开发者可以深入了解VNC的工作原理,以及如何用Java实现网络通信、图像处理和事件驱动的程序设计。这不仅可以提升Java编程能力,也能对远程桌面技术有更深入的理解。
【Java数字键盘游戏程序】是一个基于Java编程语言开发的小型游戏。尽管具体的游戏玩法没有在描述中明确提及,但从“数字键盘”这个关键词我们可以推测,这可能是一款与数字输入、数学逻辑或者数字谜题相关的游戏。...
程序通过实现`KeyListener`接口来处理键盘事件,`implements KeyListener`表明了这一点。这个接口要求实现三个方法:`keyPressed`、`keyReleased`和`keyTyped`。在`keyPressed`方法中,程序通过比较`KeyEvent`对象的...
2. 如何实现键盘监听,理解事件驱动编程的概念。 3. GUI设计原则,如用户体验和视觉一致性。 4. Java中的LookAndFeel机制,了解如何改变应用程序的外观。 总的来说,这个JAVA课程设计项目涵盖了GUI编程的核心概念,...
因此,Java中的事件监听和处理机制(如java.awt.event包下的各种事件监听器)将被广泛使用,以响应用户的键盘和鼠标输入。 3. **JNI(Java Native Interface)**:由于Vim原生支持许多复杂的文本处理和编辑命令,...
键盘过滤驱动属于内核模式驱动,因为它们需要在操作系统的核心层运行,以便能够及时响应键盘事件并进行修改。这种驱动程序编写复杂,需要深入理解操作系统的内部工作原理,特别是中断处理和设备驱动模型。 改键功能...
1. **键盘事件处理**:在各种编程语言中,如JavaScript、Python、C#等,都有处理键盘输入的API。例如,JavaScript中的`event.key`或`event.keyCode`可以用来检测用户按下的是哪个键。在Python中,可以使用`pynput`库...
- `KeyListener` 处理键盘事件,如按键按下、释放等。 - `ActionListener` 对应于用户执行的特定动作,比如按钮被点击。 - `ItemListener` 应用于复选框和单选按钮的选择变化。 - `FocusListener` 关注组件获得或...
4. **事件驱动编程**:在坦克大战中,游戏的运行依赖于事件的触发,如键盘输入、时间流逝等。Java的事件监听机制在此发挥关键作用,通过注册监听器和处理事件,使得游戏能够实时响应用户的操作。 5. **多线程技术**...
调用了两种驱动,实现了驱动模拟按键。 其中BackInC汇编调用的驱动,可以支持usb键盘 win7 32位 xp 32位测试成功,其他自测 调用方式打包成模块了,写了个简单的例子 下图为工商安全控件模拟输入。我试了农业银行的...
Java事件驱动程序设计相关程序源代码,包括事件和事件源、事件的监听、注册和处理、内部类监听器、匿名内部类监听器、处理简单行为的事件、处理窗口事件、监听器接口适配器、鼠标事件、键盘事件、使用Timer类的动画...