2016-06-27 3 views
2

Итак, я пытаюсь автоматически войти в систему через клиент WinSCP. У меня есть все учетные данные, сохраненные в клиенте, когда я его открываю. Если я вручную нажмите Enter на клавиатуре, то клиент будет войти. Я попытался с помощью метода robot зачисленного @SlanecКак автоматизировать логин клиента с помощью Java?

Robot r = new Robot(); 
r.keyPress(KeyEvent.VK_ENTER); 
r.keyRelease(KeyEvent.VK_ENTER); 

Однако, когда я проверил Java API это только кажется, проверить, является ли или не ключ нажата пользователем?

В любом случае ... это код, который у меня есть. Код открывает командную строку и вводит указанный путь к файлу, чтобы открыть специальное приложение WinSCP. После того, как приложение открыто, я хочу, чтобы клавиша Enter была нажата, чтобы я мог войти в систему. Если я вручную нажимаю клавишу ввода во время этого процесса, она будет работать нормально. Итак, возможно ли, чтобы код java нажал клавишу ввода для меня, чтобы процесс был полностью автоматическим? Я добавил программу для завершения в течение 5 секунд просто для тестирования. Любой вход был бы весьма признателен.

import java.awt.AWTException; 
import java.awt.Robot; 
import java.awt.event.KeyEvent; 
import java.io.IOException; 

public class runADP 
{ 

    public static void main(String[] args) 
    { 
      try 
      { 
       System.out.println("Opening WinSCP"); 
       Runtime runTime = Runtime.getRuntime(); 
       Process process = runTime.exec("C:\\Program Files (x86)\\WinSCP\\WinSCP.exe"); 
       try 
       { 
         Thread.sleep(5000); 
         Robot r = null; 
          try 
          { 
           r = new Robot(); 
           r.keyPress(KeyEvent.VK_ENTER); 
           r.keyRelease(KeyEvent.VK_ENTER); 

          } 
          catch (AWTException e) 
          { 
           e.printStackTrace(); 
          } 

       } 
       catch (InterruptedException e) 
       { 
        e.printStackTrace(); 
       } 
      System.out.println("Closing WinSCP"); 
      process.destroy(); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
} 

}

+1

вам может понадобиться, чтобы сфокусировать приложение –

+0

Да, я думал о попытке что-то подобное, пытаясь сосредоточиться на приложение, чтобы принести рамку на фронт, но не смогли найти ничего, чтобы достигнуть этого. Кроме того, я не думаю, что это будет полностью работать, потому что мне не нужно кликать по клиенту, когда я хочу войти в систему (например, когда я нажимаю клавишу ввода вручную, он все равно работает нормально. Не кликайте клиентом, чтобы сфокусировать его). – duffanpj

ответ

3

я понял, что происходит. Две клавиши пресса выполнялись до того, как клиент мог открыть. Я просто добавил команду thread.sleep, окруженную блоком try и catch, и теперь код работает отлично.

public void go() 
    { 
     try 
     { 
      System.out.println("Opening WinSCP"); 
      Runtime runTime = Runtime.getRuntime(); 
      Process process = runTime.exec("C:\\Program Files (x86)\\WinSCP\\WinSCP.exe"); 
      Robot r = null; 
      try 
      { 
       Thread.sleep(2000); 
       r = new Robot(); 
       r.keyPress(KeyEvent.VK_ENTER); 
       r.keyRelease(KeyEvent.VK_ENTER); 

      } 
      catch (AWTException | InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
     catch (IOException e) 
     { 
     e.printStackTrace(); 
     } 
} 
Смежные вопросы