机器人类java,输入字符串问题

发布于 2024-12-27 13:03:11 字数 527 浏览 5 评论 0原文

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

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

I m using the following loop , but its only typing the first charecter and the rest as numbers, any idea ?

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

OUTPUT typing : F135

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

懒猫 2025-01-03 13:03:11

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 以及 Shift。无法知道键盘的实际映射来自动执行此操作。

所以机器人并不是做到这一点的好方法。

The keyPress/Release methods need an int value that represents the character you want to type. These value are the key code for each character as determined by the KeyEvent.VK_??? variables.

Try:

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

However, even this won't work for all characters. For example on my keyboard the "%" is above the "5". You can't use VK_PERCENT. The key stroke needed is VK_5 along with a shift. There is no way to know the actual mapping of your keyboard to do this automatically.

So a Robot is not a good way to do this.

勿忘心安 2025-01-03 13:03:11

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

The Robot class uses key codes which are defined here: http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/event/KeyEvent.html, not raw characters. You need to call it like this:

r.keyPress(KeyEvent.VK_A);
r.keyRelease(KeyEvent.VK_A);
决绝 2025-01-03 13:03:11

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

  }

@ camickr I made a small edit to your scipt to accomodate a string rather than a letter . Please find below . It helped me Thanks :) function call : 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);
      }
      }

  }
音栖息无 2025-01-03 13:03:11

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

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

You could also load your String to the clipboard and just paste it where ever you want to.

                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);
我家小可爱 2025-01-03 13:03:11

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

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

You can make your life easy if you create a function receiving a string to be typed:

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);
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文