我想使用Java自动登录到任何桌面应用程序,如Lotus、Outlook或任何其他需要用户身份验证的应用程序()。
比方说,我想使用Java程序自动登录桌面Skype应用程序,即我们将打开Skype.exe&将提供身份验证详细信息(用户名、密码)作为参数。
在搜索时,我知道我们有一个机器人API,所以我用下面的方式尝试它。
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import static java.awt.event.KeyEvent.*;
public class RobotExp {
Robot robot = new Robot();
public static void main(String[] args) {
try {
// Process process = new ProcessBuilder(
// "C:\Windows\System32\notepad.exe").start();//C:SmartClientCacheAppsEllie
// MaeEncompass
Process process = new ProcessBuilder(
"C:\Program Files (x86)\Skype\Phone\Skype.exe").start();
new RobotExp();
} catch (Exception e) {
// TODO: handle exception
}
}
public RobotExp() throws AWTException {
robot.delay(1200);
// robot.keyPress(KeyEvent.VK_TAB);
// robot.delay(200);
type("testaccess");
// robot.setAutoDelay(40);
// robot.setAutoWaitForIdle(true);
//
// robot.delay(4000);
// robot.mouseMove(40, 130);
// robot.delay(500);
//
robot.keyPress(KeyEvent.VK_TAB);
type("test@1234");
// robot.delay(200);
robot.keyPress(KeyEvent.VK_ENTER);
// type("wish is your");
// robot.delay(500);
// leftClick();
//
// robot.delay(500);
// type("Hello, world");
//
// robot.mouseMove(40, 160);
// robot.delay(500);
//
// leftClick();
// robot.delay(500);
// leftClick();
//
// robot.delay(500);
// type("This is a test of the Java Robot class");
//
// robot.delay(50);
// type(KeyEvent.VK_DOWN);
//
// robot.delay(250);
// type("Four score and seven years ago, our fathers ...");
//
// robot.delay(1000);
System.exit(0);
}
// private void leftClick() {
// robot.mousePress(InputEvent.BUTTON1_MASK);
// robot.delay(200);
// robot.mouseRelease(InputEvent.BUTTON1_MASK);
// robot.delay(200);
// }
// private void rightClick() {
// robot.mousePress(InputEvent.BUTTON2_MASK);
// robot.delay(200);
// robot.mouseRelease(InputEvent.BUTTON2_MASK);
// robot.delay(200);
// }
// private void type(int i) {
// robot.delay(40);
// robot.keyPress(i);
// robot.keyRelease(i);
// }
// private void type(String s) {
// byte[] bytes = s.getBytes();
// for (byte b : bytes) {
// int code = b;
// // keycode only handles [A-Z] (which is ASCII decimal [65-90])
// if (code > 96 && code < 123)
// code = code - 32;
// robot.delay(40);
// robot.keyPress(code);
// robot.keyRelease(code);
// }
// }
public void type(CharSequence characters) {
int length = characters.length();
for (int i = 0; i < length; i++) {
char character = characters.charAt(i);
type(character);
}
}
public void type(char character) {
switch (character) {
case 'a':
doType(VK_A);
break;
case 'b':
doType(VK_B);
break;
case 'c':
doType(VK_C);
break;
case 'd':
doType(VK_D);
break;
case 'e':
doType(VK_E);
break;
case 'f':
doType(VK_F);
break;
case 'g':
doType(VK_G);
break;
case 'h':
doType(VK_H);
break;
case 'i':
doType(VK_I);
break;
case 'j':
doType(VK_J);
break;
case 'k':
doType(VK_K);
break;
case 'l':
doType(VK_L);
break;
case 'm':
doType(VK_M);
break;
case 'n':
doType(VK_N);
break;
case 'o':
doType(VK_O);
break;
case 'p':
doType(VK_P);
break;
case 'q':
doType(VK_Q);
break;
case 'r':
doType(VK_R);
break;
case 's':
doType(VK_S);
break;
case 't':
doType(VK_T);
break;
case 'u':
doType(VK_U);
break;
case 'v':
doType(VK_V);
break;
case 'w':
doType(VK_W);
break;
case 'x':
doType(VK_X);
break;
case 'y':
doType(VK_Y);
break;
case 'z':
doType(VK_Z);
break;
case 'A':
doType(VK_SHIFT, VK_A);
break;
case 'B':
doType(VK_SHIFT, VK_B);
break;
case 'C':
doType(VK_SHIFT, VK_C);
break;
case 'D':
doType(VK_SHIFT, VK_D);
break;
case 'E':
doType(VK_SHIFT, VK_E);
break;
case 'F':
doType(VK_SHIFT, VK_F);
break;
case 'G':
doType(VK_SHIFT, VK_G);
break;
case 'H':
doType(VK_SHIFT, VK_H);
break;
case 'I':
doType(VK_SHIFT, VK_I);
break;
case 'J':
doType(VK_SHIFT, VK_J);
break;
case 'K':
doType(VK_SHIFT, VK_K);
break;
case 'L':
doType(VK_SHIFT, VK_L);
break;
case 'M':
doType(VK_SHIFT, VK_M);
break;
case 'N':
doType(VK_SHIFT, VK_N);
break;
case 'O':
doType(VK_SHIFT, VK_O);
break;
case 'P':
doType(VK_SHIFT, VK_P);
break;
case 'Q':
doType(VK_SHIFT, VK_Q);
break;
case 'R':
doType(VK_SHIFT, VK_R);
break;
case 'S':
doType(VK_SHIFT, VK_S);
break;
case 'T':
doType(VK_SHIFT, VK_T);
break;
case 'U':
doType(VK_SHIFT, VK_U);
break;
case 'V':
doType(VK_SHIFT, VK_V);
break;
case 'W':
doType(VK_SHIFT, VK_W);
break;
case 'X':
doType(VK_SHIFT, VK_X);
break;
case 'Y':
doType(VK_SHIFT, VK_Y);
break;
case 'Z':
doType(VK_SHIFT, VK_Z);
break;
case '`':
doType(VK_BACK_QUOTE);
break;
case '0':
doType(VK_0);
break;
case '1':
doType(VK_1);
break;
case '2':
doType(VK_2);
break;
case '3':
doType(VK_3);
break;
case '4':
doType(VK_4);
break;
case '5':
doType(VK_5);
break;
case '6':
doType(VK_6);
break;
case '7':
doType(VK_7);
break;
case '8':
doType(VK_8);
break;
case '9':
doType(VK_9);
break;
case '-':
doType(VK_MINUS);
break;
case '=':
doType(VK_EQUALS);
break;
case '~':
doType(VK_SHIFT, VK_BACK_QUOTE);
break;
case '!':
doType(VK_EXCLAMATION_MARK);
break;
case '@':
doType(VK_AT);
break;
case '#':
doType(VK_NUMBER_SIGN);
break;
case '$':
doType(VK_DOLLAR);
break;
case '%':
doType(VK_SHIFT, VK_5);
break;
case '^':
doType(VK_CIRCUMFLEX);
break;
case '&':
doType(VK_AMPERSAND);
break;
case '*':
doType(VK_ASTERISK);
break;
case '(':
doType(VK_LEFT_PARENTHESIS);
break;
case ')':
doType(VK_RIGHT_PARENTHESIS);
break;
case '_':
doType(VK_UNDERSCORE);
break;
case '+':
doType(VK_PLUS);
break;
case 't':
doType(VK_TAB);
break;
case 'n':
doType(VK_ENTER);
break;
case '[':
doType(VK_OPEN_BRACKET);
break;
case ']':
doType(VK_CLOSE_BRACKET);
break;
case '\':
doType(VK_BACK_SLASH);
break;
case '{':
doType(VK_SHIFT, VK_OPEN_BRACKET);
break;
case '}':
doType(VK_SHIFT, VK_CLOSE_BRACKET);
break;
case '|':
doType(VK_SHIFT, VK_BACK_SLASH);
break;
case ';':
doType(VK_SEMICOLON);
break;
case ':':
doType(VK_COLON);
break;
case ''':
doType(VK_QUOTE);
break;
case '"':
doType(VK_QUOTEDBL);
break;
case ',':
doType(VK_COMMA);
break;
case '<':
doType(VK_LESS);
break;
case '.':
doType(VK_PERIOD);
break;
case '>':
doType(VK_GREATER);
break;
case '/':
doType(VK_SLASH);
break;
case '?':
doType(VK_SHIFT, VK_SLASH);
break;
case ' ':
doType(VK_SPACE);
break;
default:
throw new IllegalArgumentException("Cannot type character "
+ character);
}
}
private void doType(int... keyCodes) {
doType(keyCodes, 0, keyCodes.length);
}
private void doType(int[] keyCodes, int offset, int length) {
if (length == 0) {
return;
}
robot.keyPress(keyCodes[offset]);
doType(keyCodes, offset + 1, length - 1);
robot.keyRelease(keyCodes[offset]);
}
}
但仍然没有取得任何成功。
是否真的可以使自动登录到任何桌面应用程序?
请让我知道是否有任何建议或方法可以实现它?
据我所知,这在Java中是不可能的。每个应用程序都有自己的登录机制,Robot API的主要目的是用于Java平台实现的自动化测试。