`
harry
  • 浏览: 179836 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java中实现鼠标模拟与键盘映射

    博客分类:
  • Java
阅读更多
Java SDK 1.3以后实现了Robot类。此类用于为测试自动化、自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件。Robot 的主要目的是便于 Java 平台实现自动测试。
使用该类生成输入事件与将事件发送到 AWT 事件队列或 AWT 组件的区别在于:事件是在平台的本机输入队列中生成的。例如,Robot.mouseMove 将实际移动鼠标光标,而不是只生成鼠标移动事件。
Robot中主要的鼠标和键盘控制方法有:

  • void keyPress(int keycode) 按下给定的键。
  • void keyRelease(int keycode) 释放给定的键。
  • void mouseMove(int x, int y) 将鼠标指针移动到给定屏幕坐标。
  • void mousePress(int buttons) 按下一个或多个鼠标按钮。
  • void mouseRelease(int buttons) 释放一个或多个鼠标按钮。
  • void mouseWheel(int wheelAmt) 在配有滚轮的鼠标上旋转滚轮。

下面就让我们来实战鼠标控制,实现一个简单的鼠标控制程序MouseController。程序功能很简单:随机移动鼠标并点击左键。

代码如下:

import java.awt.AWTException;

import java.awt.Dimension;

import java.awt.Robot;

import java.awt.Toolkit;

import java.awt.event.InputEvent;

import java.util.Random;


/**

*

* @author Xiaofeng Wang

*/

public class MouseController implements Runnable {

private Dimension dim;

private Random rand;

private Robot robot;

private volatile boolean stop = false;

/** Creates a new instance of Main */

public MouseController() {

dim = Toolkit.getDefaultToolkit().getScreenSize();

rand = new Random();

try {

robot = new Robot();

} catch (AWTException ex) {

ex.printStackTrace();

}

}


public void run() {

while(!stop) {

int x = rand.nextInt(dim.width);

int y = rand.nextInt(dim.height);

robot.mouseMove(x, y);

robot.mousePress(InputEvent.BUTTON1_MASK);

try {

Thread.sleep(3000);

} catch (InterruptedException ex) {

ex.printStackTrace();

}

}

}

public synchronized void stop() {

stop = true;

}

/** * @param args the command line arguments */

public static void main(String[] args) {

MouseController mc = new MouseController();

Thread mcThread = new Thread(mc);

System.out.println("Mouse Controller start");

mcThread.start();

try {

Thread.sleep(60000);

} catch (InterruptedException ex) {

ex.printStackTrace();

}

mc.stop();

System.out.println("Mouse Controller stoped");

}

}

当然键盘映射也类似,无非是使用void keyPress(int keycode)。

现 在实现了控制鼠标和键盘,接下了我们要获取操作后的效果(屏幕截图)。好在Robot类也提供了一个方法:BufferedImage createScreenCapture(Rectangle screenRect);可以直接将全屏幕或某个屏幕区域的像素拷贝到一个BufferedImage对象中。

好,下面实战使用robot截屏,实现Capture程序,每隔1秒截屏一次。

代码如下:

public class Capture extends javax.swing.JFrame implements Runnable {

/** Creates new form Capture */

public Capture() {

initComponents();

try {

robot = new Robot();

} catch (AWTException ex) {

ex.printStackTrace();

}

dim = Toolkit.getDefaultToolkit().getScreenSize(); }

/** This method is called from within the constructor to

* initialize the form.

* WARNING: Do NOT modify this code. The content of this method is

* always regenerated by the Form Editor.

*/

// <editor-fold desc=" 生成的代码 " defaultstate="collapsed"></editor-fold>

private void initComponents() {

screenCanvas = new java.awt.Canvas();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

stop = true;

setResizable(false);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(screenCanvas, javax.swing.GroupLayout.PREFERRED_SIZE, 519, javax.swing.GroupLayout.PREFERRED_SIZE) );

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(screenCanvas, javax.swing.GroupLayout.PREFERRED_SIZE, 434, javax.swing.GroupLayout.PREFERRED_SIZE)

);

pack();

}//

/** * @param args the command line arguments */

public static void main(String args[]) {

final Capture capture = new Capture();

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

capture.setVisible(true);

}

});

Thread cutThread = new Thread(capture);

cutThread.start();

}

public void run() {

stop = false;

while(!stop) {

BufferedImage bImage = robot.createScreenCapture(new Rectangle(dim.width, dim.height));

Graphics g = this.screenCanvas.getGraphics();

g.drawImage(bImage, 0, 0, this);

try {

Thread.sleep(1000);

} catch (InterruptedException ex) {

ex.printStackTrace();

}

}

}

private synchronized void stop() {

stop = true;

}

// 变量声明 - 不进行修改

private java.awt.Canvas screenCanvas;

// 变量声明结束

private volatile boolean stop;

private Robot robot;

private Dimension dim;

}

分享到:
评论

相关推荐

    Java实现鼠标模拟与键盘映射

    主要为大家详细介绍了Java实现鼠标模拟与键盘映射,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    JAVA上百实例源码以及开源项目源代码

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    JAVA上百实例源码以及开源项目

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    Java开发技术大全(500个源代码).

    MyFileOutput.java 将键盘读入的文字保存到文件 MyPipedIO.java 管道流示例 MySequenceIn.java 顺序输入流示例 ObjectFileTest.java 序列化对象示例 ReadAndWrite.java 读入和写出数据 ReadAndWriteFile.java ...

    ControllerToKeys:使用控制器模拟键盘和鼠标。-开源

    ControllerToKeys旨在通过模拟按键,鼠标移动,鼠标按钮,滚轮和按键组合(即alt + tab),为所有没有该功能的PC游戏提供完全的控制器支持。 通过保存和共享按钮映射的能力,目的是能够通过以下方式与他人公开共享...

    java范例开发大全源代码

     实例13 Java中的进制与移位运算符 22  第3章 条件控制语句(教学视频:75分钟) 26  3.1 if控制语句 26  实例14 判断输入的年份是否为闰年 26  实例15 抽奖活动 27  3.2 for语句 28  实例16 ...

    java范例开发大全

    实例13 Java中的进制与移位运算符 22 第3章 条件控制语句(教学视频:75分钟) 26 3.1 if控制语句 26 实例14 判断输入的年份是否为闰年 26 实例15 抽奖活动 27 3.2 for语句 28 实例16 小九九乘法表 28 实例17 如何列...

    Java范例开发大全 (源程序)

     实例13 Java中的进制与移位运算符 22  第3章 条件控制语句(教学视频:75分钟) 26  3.1 if控制语句 26  实例14 判断输入的年份是否为闰年 26  实例15 抽奖活动 27  3.2 for语句 28  实例16 小九九...

    Java范例开发大全(全书源程序)

    实例13 Java中的进制与移位运算符 22 第3章 条件控制语句(教学视频:75分钟) 26 3.1 if控制语句 26 实例14 判断输入的年份是否为闰年 26 实例15 抽奖活动 27 3.2 for语句 28 实例16 小九九乘法表 28 实例17...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作...

    java范例开发大全(pdf&源码)

    实例13 Java中的进制与移位运算符 22 第3章 条件控制语句(教学视频:75分钟) 26 3.1 if控制语句 26 实例14 判断输入的年份是否为闰年 26 实例15 抽奖活动 27 3.2 for语句 28 实例16 小九九乘法表 28 实例17 如何列...

    Android 开发技巧

    9.86.4、模拟键盘鼠标事件(Socket+Instrumentation实现) 332 9.86.5、再述模拟键盘鼠标事件(adb shell 实现) 334 9.87、反编译APK 344 9.88、更换APK图标(签名打包) 348 9.89、利用ANDROID MARKET赚钱 363 9.90...

    Android开发资料合集-World版!

    9.86.4、模拟键盘鼠标事件(Socket+Instrumentation实现) 332 9.86.5、再述模拟键盘鼠标事件(adb shell 实现) 334 9.87、反编译APK 344 9.88、更换APK图标(签名打包) 348 9.89、利用ANDROID MARKET赚钱 363 9.90...

    WEB设计大全

    文本、按钮、图标及图形 &lt;br&gt;6.1 基本的Web链接模型 &lt;br&gt;6.1.1 结构和非结构链接的比较 &lt;br&gt;6.1.2 静态和动态链接 &lt;br&gt;6.2 ...6.2.5 图像映射 &lt;br&gt;6.2.6 其他链接方式 &lt;br&gt;6.3 链接的实现问题...

    WEB设计大全(part2)

    文本、按钮、图标及图形 &lt;br&gt;6.1 基本的Web链接模型 &lt;br&gt;6.1.1 结构和非结构链接的比较 &lt;br&gt;6.1.2 静态和动态链接 &lt;br&gt;6.2 ...6.2.5 图像映射 &lt;br&gt;6.2.6 其他链接方式 &lt;br&gt;6.3 链接的实现问题...

Global site tag (gtag.js) - Google Analytics