【问题标题】:Use robot to click and type in Microsoft Word not working使用机器人单击并输入 Microsoft Word 不起作用
【发布时间】:2014-06-14 15:42:57
【问题描述】:

我创建了以下代码来执行以下操作:

  1. 新建一个 Word 文件并打开
  2. 检查任务管理器是否打开,然后继续
  3. 使用 Robot 类移动到屏幕中心,然后单击 Word 应用程序并键入:Y

除了输入 Y 之外,它什么都做。

代码:

// Open Word Document
public boolean openWordDoc(String tempProName, String URL, String j) throws IOException, AWTException {

    boolean result = false;

    String userHomeFolder = System.getProperty("user.home");
    File textFile = new File((userHomeFolder + "/Desktop"), j + " " + URL);
    BufferedWriter out = new BufferedWriter(new FileWriter(textFile));
    out.close();
    if (Desktop.isDesktopSupported()) {
        Desktop fD = Desktop.getDesktop();
        fD.open(textFile);
    }

    // See if it really did open and wait until it opened to continue
    String line = "";
    Process p = Runtime.getRuntime().exec("tasklist.exe");
    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
    while ((!line.equals("WINWORD.EXE"))) {
        while ((line = input.readLine()) != null) {
            String[] templine = line.split(" ");
            if (templine[0].equals("WINWORD.EXE")) {
                line = "WINWORD.EXE"; 
                result = true;
                break;
            }
        }
    }

    // Robot
    Robot robot = new Robot();

    double x = 0;
    double y = 0;

    x = Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2;
    y = Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2;

    int xx = (int) Math.round(x);
    int yy = (int) Math.round(y);

    robot.mouseMove(xx, yy);

    robot.mousePress(InputEvent.BUTTON1_MASK);

    robot.keyPress(KeyEvent.VK_Y);

    return result;
}

【问题讨论】:

    标签: java ui-automation awtrobot


    【解决方案1】:

    由于总是在屏幕中间打开一个弹出窗口,因此可以肯定地说:

    Dimension middle = new Dimension(Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2, Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2);
    

    返回屏幕的精确中间。现在您必须将光标相对于中间移动到按钮所在的位置。为此,您可以一遍又一遍地尝试,但您也可以设置一个 while 循环来告诉您按钮在哪里。像这样:

    while(true){
        System.out.println(MouseInfo.getPointerInfo().getLocation());
    }
    

    现在您知道按钮在屏幕上的位置,但现在您应该将其设为相对于中间的位置,这样它就可以在任何尺寸的任何屏幕上工作。因此,您必须考虑 x 和 y 的差异。既然您知道按钮相对于中间的位置,您可以说:

    Robot robot = new Robot();
    robot.mouseMove(middle.getWidth() + differenceX, middle.getHeight() + differenceY);
    robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
    

    请注意,这种方式并不完全安全。如果用户在单击之前设法移动弹出窗口,则代码将单击其他位置。

    但对于其余部分,我相信此代码将在所有监视器上运行。但我没有测试过。您可能需要让机器人点击两次以获得焦点,然后再让机器人真正点击。如果您还有其他问题,请不要犹豫,问他们。

    我希望这可行。

    按键代码:

    // Robot
        Robot robot = new Robot();
    
        double x = 0;
        double y = 0;
    
        x = Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2;
        y = Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2;
    
        int xx = (int) Math.round(x);
        int yy = (int) Math.round(y);
    
        robot.mouseMove(xx, yy);
        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
        robot.keyPress(KeyEvent.VK_Y);
    

    您应该能够看到它的去向。
    我希望这可行:)。

    【讨论】:

    • 好的,所以我只是在 Word 中玩弄它,到目前为止它似乎可以工作,谢谢:)。
    • 哇,这个问题太糟糕了,我不能再问另一个了然后使用机器人单击然后键入由于某种原因单击被接受但键入不被接受。当我说接受时,我的意思是点击正在注册并且类型代码正在发生,但字母没有出现在 Word 上。我可以把代码发给你。
    • 好吧,我看到你的问题确实不是很被接受......但我不同意那些说不清楚的人(我还能怎么回答?)。但是,是的,我会帮你输入代码。此代码适用于我按下一个键(只要窗口有焦点)new Robot().keyPress(KeyEvent.VK_G); p.s.你也可以为这个答案投票。_.
    • 我不能,因为我名声不好,我试过了。好的,所以您发布的代码是我正在使用的,但它不起作用。我不能在这里发布我的代码,我可以把它发给你吗?
    • 您可以编辑您的问题,或者我可以创建一个新的(公共)聊天室。你可以选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多