【问题标题】:How can I select text in another application with java.awt.robot (example: shift+home)如何使用 java.awt.robot 在另一个应用程序中选择文本(例如:shift+home)
【发布时间】:2014-07-24 06:17:42
【问题描述】:

我正在尝试使用 java.awt.robot 自动为我修复一些 Excel 数组。为此,我需要选择单元格内的文本。似乎 shift+home 和 shift+箭头键不适用于选择文本。这是一个代码sn-p:

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

public class Fix4DArray {

public static void main(String[] args){
    int n = 10; //nominal sleep time
    try {
        Robot r = new Robot();
        Sequence(r,n,KeyEvent.VK_ALT,KeyEvent.VK_TAB); //switch windows to Excel
        Thread.sleep(200);
        Press(r,n,KeyEvent.VK_F2); //Open Excel editing for currently selected cell
        Select(r,n,KeyEvent.VK_SHIFT,KeyEvent.VK_HOME); //Select all text in cell DOES NOT WORK
        //Select(r,n,KeyEvent.VK_SHIFT,KeyEvent.VK_LEFT); //Select one character DOES NOT WORK
    }       
    catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}



public static void Press(Robot r,int sleep, int keyEvent) throws InterruptedException{
    r.keyPress(keyEvent);
    r.keyRelease(keyEvent);
    Thread.sleep(sleep);
}

public static void Select(Robot r, int sleep, int... keyEvents ) throws InterruptedException{
    r.keyPress(keyEvents[0]);       
    for(int i = 1; i < keyEvents.length; i++){
        r.keyPress(keyEvents[i]);
        Thread.sleep(sleep);
    }
    r.keyRelease(keyEvents[0]);

}

public static void Sequence(Robot r, int sleep, int... keyEvents ) throws InterruptedException{
    for(int i = 0; i < keyEvents.length; i++){
        r.keyPress(keyEvents[i]);
        Thread.sleep(sleep);
    }
    for(int i = keyEvents.length; i > 0 ; i--){
        r.keyRelease(keyEvents[i-1]);
        Thread.sleep(sleep);
    }
}
}

请注意,如果您在开头注释掉 alt+tab(第 12 行)并从 Eclipse(或其他 IDE)运行,它也将不会在 Eclipse 中选择文本,尽管它会移动光标。 CTRL-A 确实有效,但不会在 Excel 中选择文本,所以这是不行的。

我在https://community.oracle.com/thread/1289981?start=0&tstart=0 找到了一个关于这个主题的参考资料,但他们没有找到解决方案。

任何帮助将不胜感激。或在 Excel 中选择文本的另一种解决方案。请注意,VBA 和宏也不适用于我正在尝试的特定任务。

谢谢。

使用 Sesame 的建议进行更新,我能够删除文本。现在我想使用 shift+arrow 或一些变通方法来选择单元格。这是更新的代码sn-p;请注意不起作用的行:

        Robot r = new Robot();
        Sequence(r,n,KeyEvent.VK_ALT,KeyEvent.VK_TAB); //switch windows to Excel
        Thread.sleep(200);
        Press(r,n,KeyEvent.VK_SPACE); //replace text with space
        Select(r,n,KeyEvent.VK_CONTROL,KeyEvent.VK_Z); //UNDO to select text in cell
        Select(r,n,KeyEvent.VK_CONTROL,KeyEvent.VK_X); //CUT
        Sequence(r,n,KeyEvent.VK_CONTROL,KeyEvent.VK_SHIFT, KeyEvent.VK_ENTER); //Delete the array
        Select(r,n,KeyEvent.VK_SHIFT,KeyEvent.VK_RIGHT,KeyEvent.VK_RIGHT,KeyEvent.VK_RIGHT); //Select cells DOES NOT WORK
        Press(r,n,KeyEvent.VK_F2); //Open cell combination for typing array
        Sequence(r,n,KeyEvent.VK_CONTROL,KeyEvent.VK_SHIFT, KeyEvent.VK_ENTER); //Input the array

【问题讨论】:

    标签: java awtrobot


    【解决方案1】:

    导航到一个单元格并按 space 然后按 ctrl + z(撤消)选择该单元格中的文本。基本上它会清除正方形,当您撤消清除时,会选择文本。这很丑,但如果你只需要这些,我想它可以工作。

    【讨论】:

    • 这适用于选择单元格中的文本并删除数组。现在我需要在输入公式之前通过选择单元格来调整数组的大小,这意味着我需要再次使用 shift+right。还有其他解决方法吗? (我希望数组有 4 个单元格大)。我将在我的问题中添加更新的代码 sn-p。谢谢!
    • 我不太明白什么不起作用。当我按照您的按键操作时,它似乎完美地选择了四个单元格(与您使用鼠标的方式相同)。然后 ctrl+shift enter 分别应用于所有四个单元格。
    • 当我运行 Robot 时,shift + right 移动光标而不是选择单元格。它在 Eclipse 中做同样的事情(移动光标而不是选择字符)。我正在通过创建一个带有快捷键的宏来选择单元格来解决另一个问题,但我真的希望有一种方法可以使用 java.awt.robot 选择文本/单元格。谢谢!
    • 我让它与变通方法一起工作。我希望我可以选择机器人,但是很好。再次感谢您的帮助。
    猜你喜欢
    • 2015-05-03
    • 2015-07-15
    • 2021-03-06
    • 2013-09-09
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多