robot - 无法导出机器人类
问题描述
我有一个应用程序并且有一些问题,希望我能得到一些帮助。该应用程序相当简单,并且使用 awt Robot 类在我的股票提供商处处理登录和双向验证。我正在运行 windows10 和 eclipse。谷歌浏览器是它正在运行的应用程序,即我使用 ctrl + T 打开一个新标签。我遇到的问题是,应用程序在运行 froeclipse 时按预期运行,但是当导出为可运行文件时,应用程序不工作,keyPressed 不能只工作鼠标。一个快速的谷歌搜索告诉我应该使用 keylistener 但我不知道它是如何以及是否是那个问题。
`主类
package login;
import java.awt.HeadlessException;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.KeyEvent;
import java.io.IOException;
import robothelper.RobotHelper;
public class Login
{;
public static void main(String[] args) throws Throwable
{
new Login();
}
public Login() throws Throwable
{
doLogin();
}
private void doLogin() throws InterruptedException, Throwable
{
Robot robot = new Robot();
robot.setAutoDelay(40);
robot.setAutoWaitForIdle(true);
Thread.sleep(25000);
robot.keyPress(KeyEvent.VK_CONTROL);
RobotHelper.type(KeyEvent.VK_T, robot);
robot.keyRelease(KeyEvent.VK_CONTROL);
RobotHelper.type("url)", robot);
RobotHelper.type(KeyEvent.VK_ENTER,robot);
Thread.sleep(12000); //page to load
RobotHelper.setMousepointerLocation(robot, 335, 1100);
RobotHelper.leftClick(robot);
RobotHelper.type("user", robot);
RobotHelper.type(KeyEvent.VK_TAB, robot);
RobotHelper.type("pass", robot);
RobotHelper.type(KeyEvent.VK_ENTER,robot);
RobotHelper.setMousepointerLocation(robot, 53 , 950);
RobotHelper.leftClick(robot);
Thread.sleep(1000); //addon to open
runAvanzaAddon(robot);
RobotHelper.setMousepointerLocation(robot, 335, 1100);
RobotHelper.leftClick(robot);
robot.keyPress(KeyEvent.VK_CONTROL);
RobotHelper.type(KeyEvent.VK_V, robot);
robot.keyRelease(KeyEvent.VK_CONTROL);
RobotHelper.type(KeyEvent.VK_TAB, robot);
RobotHelper.type(KeyEvent.VK_ENTER,robot);
}
private void runAvanzaAddon(Robot robot) throws HeadlessException,
UnsupportedFlavorException, IOException, InterruptedException
{
RobotHelper.setMousepointerLocation(robot, 150, 740);
RobotHelper.leftClick(robot);;
String nowValue = getValuFromClipboard();
String prevValue = getValuFromClipboard();
while(nowValue.equals(prevValue))
{
Thread.sleep(200);
prevValue = nowValue;
RobotHelper.setMousepointerLocation(robot, 150, 740);
RobotHelper.leftClick(robot);
nowValue = getValuFromClipboard();
}
}
private String getValuFromClipboard() throws HeadlessException,
UnsupportedFlavorException, IOException
{
return (String) Toolkit.getDefaultToolkit()
.getSystemClipboard().getData(DataFlavor
.stringFlavor);
}
}
帮助类包robothelper;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
public class RobotHelper
{
public static void leftClick(Robot robot)
{
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
}
public static void type(int i, Robot robot)
{
robot.delay(40);
robot.keyPress(i);
robot.keyRelease(i);
}
public static void type(String text, Robot robot)
{
StringSelection stringSelection = new
StringSelection(text);
Clipboard clipboard =
Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, stringSelection);
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
}
public static void setMousepointerLocation( Robot robot, int
x,int y)
{
robot.mouseMove(y, x);
}
public static Point getMousepointerLocation()
{
return MouseInfo.getPointerInfo().getLocation();
}
}
解决方案
下面是每个人都可以运行的较短示例。应用程序在 chrome (ctrl T) 中打开一个新选项卡。我想这个问题是因为 Keylistener,我让它工作了一次。重现步骤: 1 在 chrome 上从 eclipse 运行应用程序(将打开一个新选项卡。2 在 chrome 上导出并运行应用程序(不会打开一个新选项卡。
package login;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import robothelper.RobotHelper;
public class Login
{;
public static void main(String[] args) throws Throwable
{
new Login();
}
public Login() throws Throwable
{
doLogin();
}
private void doLogin() throws InterruptedException,
Throwable
{
Robot robot = new Robot();
robot.setAutoDelay(40);
robot.setAutoWaitForIdle(true);
Thread.sleep(15000);
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvvnt.VK_T);
RobotHelper.keyRelease(KeyEvent.VK_T, robot);
robot.keyRelease(KeyEvent.VK_CONTROL);
}
}
推荐阅读
- javascript - 如何获取系统资源信息?
- spring - Spring集成:再次更新标头值时面临问题
- python - pm2 - 能够在全局日志中看到“sys.stdout”而不是 python.exe
- python - 创建变量时添加为字符串的数据类型 ...array([0., 0., 0., ..., 0., 0., 0.], dtype=float32)
- java - 防止非贪婪部分消耗以下可选部分
- ffmpeg - 对于 PSNR 过滤器,FFMPEG 是修剪和 -t 被忽略?
- email - Salesforce 通过 Apex 发送电子邮件
- dependency-injection - Angular 6+ providedIn: 'root' 引发 StaticInjectorError
- javascript - Mocha 测试失败确保调用了 don()
- wordpress - WordPress 病毒