【问题标题】:Robot class java , typing a string issue机器人类 java ,输入字符串问题
【发布时间】:2012-02-11 02:29:37
【问题描述】:

我正在使用以下循环,但它只输入第一个字符,其余为数字,知道吗?

import java.awt.*;

import javax.swing.KeyStroke;

public class test {

    public static void main(String[] args) throws AWTException
    {
        Robot r = new Robot();

        String s = "Face";

        for (int i = 0; i < s.length(); i++) 
        {
            char res = s.charAt(i);
            r.keyPress(res);
            r.keyRelease(res);  
            r.delay(1000);
        }           
    }
}

输出输入:F135

【问题讨论】:

  • 我们看到机器人的代码了吗?
  • 你能给我们看看程序输出吗?另外,你不应该在你的 for 循环中使用 i++ 而不是 ++i 吗?
  • 另外,你不需要使用 char[] c = s.toCharArray();当您在 String var s 上使用 charAt(i) 时。您也可以使用 s.length() 获取循环的长度。
  • @Brissles 是的,但还是一样
  • This 可能会有所帮助。

标签: java swing awt awtrobot


【解决方案1】:

keyPress/Release 方法需要一个表示您要键入的字符的 int 值。这些值是由 KeyEvent.VK_ 确定的每个字符的键码?变量。

试试:

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");
     }

    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);
        }
    }
}

但是,即使这样也不适用于所有角色。例如,在我的键盘上,“%”高于“5”。您不能使用 VK_PERCENT。所需的击键是 VK_5 以及移位。无法知道键盘的实际映射来自动执行此操作。

所以机器人不是这样做的好方法。

【讨论】:

    【解决方案2】:

    Robot 类使用此处定义的键码:http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/event/KeyEvent.html,而不是原始字符。你需要这样称呼它:

    r.keyPress(KeyEvent.VK_A);
    r.keyRelease(KeyEvent.VK_A);
    

    【讨论】:

      【解决方案3】:

      @camickr 我对你的 scipt 做了一个小修改,以容纳一个字符串而不是一个字母。如下请见 。它帮助了我谢谢:) 函数调用:typeCharacter(robot, "thanks");

      public static void typeCharacter(Robot robot, String letter)
            {
      
           for(int i=0;i<letter.length();i++){
            try
            {
                boolean upperCase = Character.isUpperCase( letter.charAt(i) );
                String KeyVal=Character.toString(letter.charAt(i));
                String variableName = "VK_" + KeyVal.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);
            }
            }
      
        }
      

      【讨论】:

        【解决方案4】:

        您也可以将字符串加载到剪贴板,然后将其粘贴到您想要的任何位置。

                        StringSelection selection = new StringSelection("Hello World");
                        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
                        clipboard.setContents(selection, selection);
        
                        robo.keyPress(KeyEvent.VK_CONTROL);
                        robo.keyPress(KeyEvent.VK_V);
                        robo.keyRelease(KeyEvent.VK_V);
                        robo.keyRelease(KeyEvent.VK_CONTROL);
        

        【讨论】:

          【解决方案5】:

          如果你创建一个接收要输入的字符串的函数,你可以让你的生活变得轻松:

          public void keyboardString(final String text) {
              if (text != null) {
                  try {
                      final Robot robot = new Robot();
                      for (int i = 0; i < text.length(); i++) {
                          final char ch = text.charAt(i);
                          final boolean upperCase = Character.isUpperCase(ch);
                          final int keyCode = KeyEvent.getExtendedKeyCodeForChar(ch);
                          robot.delay(10);
                          if (upperCase) {
                              robot.keyPress(KeyEvent.VK_SHIFT);
                          }
                          robot.keyPress(keyCode);
                          robot.keyRelease(keyCode);
                          if (upperCase) {
                              robot.keyRelease(KeyEvent.VK_SHIFT);
                          }
                      }
          
                  } catch (final Exception e) {
                      System.out.println(e);
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-02
            • 2014-02-05
            • 2021-01-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多