2015-11-03 21 views
0

我已经在网上找到Java代码,可以让我使用Robot类来完成各种事情。我当前正在使用它来尝试自动化需要重复输入文件名的数据库转储,在这种情况下是数字。不,我不能只在最后进行批处理文件重命名,他们必须单独命名。我不想这样做13,000次(我的数据库的大小),所以我试图自动化它。我需要的是我没有的机器人代码来输入For循环中的内容。我的代码如下:获取Java机器人以键入循环中的内容

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

public class RobotClicker 
{ 
    Robot robot = new Robot(); 

    public static void main(String[] args) throws AWTException 
    { 
    new RobotClicker(); 
    } 

    public RobotClicker() throws AWTException 
    { 
    robot.setAutoDelay(40); 
    robot.setAutoWaitForIdle(true); 

    robot.delay(4000); 
    robot.mouseMove(144, 400); 
    robot.delay(500); 

    leftClick(); 
    robot.delay(500); 
    leftClick();  

    robot.delay(500); 
    for(int i = 856; i>858;i++){ 
     String holding = "test "; 
     type(holding); 
    } 

    robot.mouseMove(450, 480); 
    robot.delay(500); 

    leftClick(); 
    robot.delay(500); 
    leftClick();  

    robot.delay(1000); 
    System.exit(0); 
    } 

    private void leftClick() 
    { 
    robot.mousePress(InputEvent.BUTTON1_MASK); 
    robot.delay(200); 
    robot.mouseRelease(InputEvent.BUTTON1_MASK); 
    robot.delay(200); 
    } 

    private void type(int i) 
    { 
    robot.delay(40); 
    robot.keyPress(i); 
    robot.keyRelease(i); 
    } 

    private void type(String s) 
    { 
    byte[] bytes = s.getBytes(); 
    for (byte b : bytes) 
    { 
     int code = b; 
     // keycode only handles [A-Z] (which is ASCII decimal [65-90]) 
     if (code > 96 && code < 123) code = code - 32; 
     robot.delay(40); 
     robot.keyPress(code); 
     robot.keyRelease(code); 
    } 
    } 
} 

文件名只是数字。我需要for循环来产生序列中的下一个数字,然后机器人输出它,重复ad nauseam。此时机器人进行移动和点击就好了,但没有任何类型。任何帮助将不胜感激。

回答

0

这里是我最终的代码。我开始数据库转储(这将弹出“保存”对话框,我将对话框移动到屏幕的左上角,屏幕上的“X”和“Y”位置是基于我的屏幕和我移动的位置对话框)。然后启动机器人程序。它将鼠标移动到对话框的“文件名”部分(根据我将文件移动到哪个位置),单击鼠标左键一次,输入序列中的下一个数字,然后将鼠标移到左侧“保存”按钮是。它等待一段时间然后重复。它在一夜之间完成了2个数据库的整个过程,所以我们不必再搞砸了。耶技术!

import java.awt.AWTException; 
import java.awt.Robot; 
import java.awt.event.InputEvent; 
import java.awt.event.KeyEvent; 
import java.lang.reflect.Field; 
import java.awt.*; 
import java.util.*; 
import java.lang.reflect.Field; 
import java.awt.event.*; 
import javax.swing.*; 

public class RobotClicker { 
    Robot robot = new Robot(); 

    public static void main(String[] args) throws AWTException { 
     new RobotClicker(); 
    } 

    public RobotClicker() throws AWTException { 
     robot.setAutoDelay(40); 
     robot.setAutoWaitForIdle(true); 

     for (int i = 0; i < 7476; i++) { 
      String holding = Integer.toString(i); 
      Robot robot = new Robot(); 

      robot.delay(4000); 
      robot.mouseMove(144, 400); 
      robot.delay(500); 

      leftClick(); 
      //robot.delay(500); 
      leftClick(); 

      robot.delay(10); 


      type(holding); 

      robot.mouseMove(450, 480); 
      robot.delay(10); 

      leftClick(); 
      robot.delay(500); 
      leftClick(); 

      robot.delay(1000); 
     } 
     System.exit(0); 
    } 

    private void leftClick() { 
     robot.mousePress(InputEvent.BUTTON1_MASK); 
     robot.delay(200); 
     robot.mouseRelease(InputEvent.BUTTON1_MASK); 
     robot.delay(200); 
    } 

    private void type(int i) { 
     robot.delay(40); 
     robot.keyPress(i); 
     robot.keyRelease(i); 
    } 

    private void type(String s) { 
     byte[] bytes = s.getBytes(); 
     for (byte b : bytes) { 
      int code = b; 
      // keycode only handles [A-Z] (which is ASCII decimal [65-90]) 
      if (code > 96 && code < 123) 
       code = code - 32; 
      robot.delay(40); 
      robot.keyPress(code); 
      robot.keyRelease(code); 
     } 
    } 

    public static void typeCharacter(Robot robot, String letter) { 
     try { 
      boolean upperCase = Character.isUpperCase(letter.charAt(0)); 
      String variableName = "VK_" + letter.toUpperCase(); 

      Class clazz = KeyEvent.class; 
      Field field = clazz.getField(variableName); 
      int keyCode = field.getInt(null); 

      robot.delay(1000); 

      if (upperCase) 
       robot.keyPress(KeyEvent.VK_SHIFT); 

      robot.keyPress(keyCode); 
      robot.keyRelease(keyCode); 

      if (upperCase) 
       robot.keyRelease(KeyEvent.VK_SHIFT); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 
} 
1

下面是一个简单的例子,可以键入字母和数字:

import java.awt.*; 
import java.util.*; 
import java.lang.reflect.Field; 
import java.awt.event.*; 
import javax.swing.*; 

public class RobotCharacter 
{ 
    public static void main(String[] args) 
     throws Exception 
    { 
     JTextField textField = new JTextField(10); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(textField); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

     Robot robot = new Robot(); 
     typeCharacter(robot, "a"); 
     typeCharacter(robot, "b"); 
     typeCharacter(robot, "C"); 
     typeCharacter(robot, "D"); 
     typeCharacter(robot, "%"); 
    } 

    public static void typeCharacter(Robot robot, String letter) 
    { 
     try 
     { 
      boolean upperCase = Character.isUpperCase(letter.charAt(0)); 
      String variableName = "VK_" + letter.toUpperCase(); 

      Class clazz = KeyEvent.class; 
      Field field = clazz.getField(variableName); 
      int keyCode = field.getInt(null); 

      robot.delay(1000); 

      if (upperCase) robot.keyPress(KeyEvent.VK_SHIFT); 

      robot.keyPress(keyCode); 
      robot.keyRelease(keyCode); 

      if (upperCase) robot.keyRelease(KeyEvent.VK_SHIFT); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
     } 
    } 
} 
+0

有没有这样的一部分,我可以在我的for循环来解决我的问题?我完全不熟悉机器人类,我只是试图快速和肮脏地把一些东西放在一起来自动化这个过程。 – Inessaria

+0

是的,我给你解决问题的代码。我演示了如何一次输入一个字符。更改您的for循环以调用字符串中每个字母的typeCharacter(...)方法。 – camickr

+0

显然我不明白。我已经修改了我的代码,以便它包含您发布的typeCharacter方法,并将我的For循环更改为(int i = 0; i> 858; i ++){0};}}}}}} String hold = Integer.toString(i); \t机器人机器人=新机器人(); typeCharacter(robot,holding); \t } 它仍然没有输出任何东西。 – Inessaria