2011-04-20 32 views
7

我想使用Java Robot鍵入:。但是,我收到IllegalArgumentException。我的代碼是:如何讓機器人類型變成`:`?

robot.keyPress(KeyEvent.VK_SHIFT); 
robot.keyPress(KeyEvent.VK_COLON); 
robot.keyRelease(KeyEvent.VK_COLON); 
robot.keyRelease(KeyEvent.VK_SHIFT); 

唯一的例外是:

java.lang.IllegalArgumentException: Invalid key code.]. 

我也試過:

robot.keyPress(KeyEvent.VK_SHIFT); 
robot.keyPress(KeyEvent.VK_SEMICOLON); 
robot.keyRelease(KeyEvent.VK_SEMICOLON); 
robot.keyRelease(KeyEvent.VK_SHIFT); 

我怎樣才能解決這個問題?

回答

14

嘗試使用此代碼:

robot.keyPress(KeyEvent.VK_SHIFT); 
robot.keyPress(KeyEvent.VK_SEMICOLON); 
robot.keyRelease(KeyEvent.VK_SEMICOLON); 
robot.keyRelease(KeyEvent.VK_SHIFT); 

與你輸入的鍵盤:按SHIFT +。你需要模擬的一樣。

嘗試運行這段代碼有嘗試的正常工作與上面的回答:

public class Test { 
    public static void main(String[] args) { 
     Robot robot; 
     try { 
      robot = new Robot(); 
      robot.keyPress(KeyEvent.VK_SHIFT); 
      robot.keyPress(KeyEvent.VK_SEMICOLON); 
      robot.keyRelease(KeyEvent.VK_SEMICOLON); 
      robot.keyRelease(KeyEvent.VK_SHIFT); 
     } catch (AWTException e) { 
      // TODO Auto-generated catch bloc 
      e.printStackTrace(); 
     } 


    } 
} 
+0

的結果是一樣的:異常的線程「主」 java.lang.IllegalArgumentException異常:無效的鍵碼 \t在sun.awt.windows.WRobotPeer.keyPress(本機方法) \t at java.awt.Robot.keyPress(Unknown Source) – 2011-04-20 20:38:10

+0

問題是分號keyEvent。如果我執行這個代碼,我會得到相同的異常,但在終止它之後,shift鍵仍然是「仍然按下」。這些代碼在你那正常嗎? – 2011-04-20 21:09:22

+0

@Eric在我的Windows XP上面的代碼工作正常。如果你仍然遇到錯誤,我會嘗試在沒有'VK_SHIFT'修飾符的情況下執行'keyPress(KeyEvent.VK_COLON)'。 – 2011-04-20 21:12:38

0

我不知道Java機器人,但如果你正在使用shift,你不應該輸入分號,因爲shift + semicolon =冒號。所以這可能是一個非法的論點,因爲冒號不是關鍵,分號就是。

+0

我試過,但沒有工作 – 2011-04-20 20:38:57

3

不幸的是,Java的Robot類依賴於特定平臺實現的所謂java.awt.peer.RobotPeer無證接口。具體平臺的具體實施決定了哪些關鍵新聞事件是合法或非法的。

在我的Windows XP中,這工作得很好:

public static void main(final String[] args) throws InterruptedException, IOException { 
    Robot robot; 
    try { 
     robot = new Robot(); 
     robot.keyPress(KeyEvent.VK_SHIFT); 
     robot.keyPress(KeyEvent.VK_SEMICOLON); 
     robot.keyRelease(KeyEvent.VK_SEMICOLON); 
     robot.keyRelease(KeyEvent.VK_SHIFT); 
    } catch (final AWTException e) { 
     // TODO Auto-generated catch bloc 
     e.printStackTrace(); 
    } 
} 

在不同的平臺上,你可能也想嘗試:

public static void main(final String[] args) throws InterruptedException, IOException { 
    Robot robot; 
    try { 
     robot = new Robot(); 
     robot.keyPress(KeyEvent.VK_COLON); 
     robot.keyRelease(KeyEvent.VK_COLON); 
    } catch (final AWTException e) { 
     // TODO Auto-generated catch bloc 
     e.printStackTrace(); 
    } 
} 
+0

這也適用於Windows 7 ... – Makky 2011-12-22 14:08:03

0

試試這個代碼


 case KeyEvent.VK_SEMICOLON: 
      if((event.getModifiers() & KeyEvent.KEY_PRESSED)!=0) 
       System.out.println(":"); 
      else 
       System.out.print(";"); 
      break; 
1

嘗試此代碼;),也許它有幫助(使用ascii代碼al t + 5 + 8 = :):

robot9.delay(20); 
robot9.keyPress(KeyEvent.VK_ALT); 
robot9.delay(20); 
robot9.keyPress(KeyEvent.VK_NUMPAD5); 
robot9.keyRelease(KeyEvent.VK_NUMPAD5); 
robot9.delay(20); 
robot9.keyPress(KeyEvent.VK_NUMPAD8); 
robot9.keyRelease(KeyEvent.VK_NUMPAD8); 
robot9.delay(20); 
robot9.keyRelease(KeyEvent.VK_ALT); 
robot9.delay(20); 
+0

謝謝。這個概念適用於:還有\符號。所以我可以輸入文件位置到彈出文件瀏覽器。你節省了我幾個小時。謝謝。 – David 2018-02-27 12:35:46

1

這也似乎是語言相關的。在德語鍵盤上,使用VK_SHIFTVK_PERIOD的組合工作。

0

分號是一個 「大寫在前福斯產品」,也就是你只有用鑰匙

Shift +昏迷

組合讓它試試這個:

robot = new Robot(); 
robot.keyPress(KeyEvent.VK_SHIFT); 
robot.keyPress(KeyEvent.VK_COMMA); 
//Since you have the Shift pressed it will generate a semi colon. 
robot.keyRelease(KeyEvent.VK_COMMA); 
robot.keyRelease(KeyEvent.VK_SHIFT); 

我希望我能幫上忙。

祝您有愉快的一天。 :)